[R] sequential sum
David Winsemius
dwinsemius at comcast.net
Tue Feb 14 20:28:21 CET 2012
On Feb 14, 2012, at 1:38 PM, Nordlund, Dan (DSHS/RDA) wrote:
>> -----Original Message-----
>> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
>> project.org] On Behalf Of baccts
>> Sent: Tuesday, February 14, 2012 9:04 AM
>> To: r-help at r-project.org
>> Subject: [R] sequential sum
>>
>> Dear R users,
>>
>> I am trying to sum number that exist in another vector up to i, then
>> increment i and repeat.
>> Sorry. It's hard to explain but basically I am trying to do the
>> following:
>> test <- c(1,2,3,4);
>> test2 <- c(3,5,6,7,2,8,8,4,4);
>> test3 <- c(10,20,30,40);
>> tmp <- 0;
>> for (i in 1:length(test)){
>> tmp[i] <- sum(test3[which(test[1:i] %in% test2)]);
>> }
>>
>> so when i = 1, tmp[i] = 0 because test[1]=1 is not in test2 and
>> when i = 3, tmp[i] = 50 = test3[2] + test3[3] because test[2:3] is in
>> test2
>>
>> Problem is test has 5000+ entries. How do I do the same thing without
>> the
>> loop?
>>
>> Thanks in advance.
>>
>
> Your example data is not very extensive so I don't know if this
> solution is general enough. But, it does work with your data.
I had exactly that concern so tested my solution, which was a bit
different than yours:
test <- c(1,2,3,4,10, 5);
test2 <- c(3,5,6,7,2,8,8,4,4);
test3 <- c(10,20,30,40, 50, 60);
tmp <- 0;
for (i in 1:length(test)){
tmp[i] <- sum(test3[which(test[1:i] %in% test2)]);
}
> tmp
[1] 0 20 50 90 90 150
> tmp2 <- ifelse(test %in% test2, cumsum(test3[test %in% test2]), 0)
> tmp2
[1] 0 50 90 150 0 50 # was going to throw away.
> tmp3 <- cumsum(ifelse(test %in% test2, test3, 0))
> tmp3
[1] 0 20 50 90 90 150
So yours is better at spanning the non-match entries in the same
manner as the for-loop.
>
>
> Hope this is helpful,
>
> Dan
>
> Daniel J. Nordlund
David Winsemius, MD
West Hartford, CT
More information about the R-help
mailing list