how to sum up rows selectively in R? -
here head of data sample.
size ofr bid 1 362.25 361.75 1 362.25 361.75 3 362.25 361.75 4 362.75 362 8 362.50 362 6 362.50 362 12 362.50 362 8 362.25 362 9 362.25 362 11 362.25 362 i trying implement loop sum size if ofr[i]=ofr[i-1] & bid[i]= bid[i-1]. in new data frame, there fewer rows.
my current coding is:
l<-length(mtq$size) mtq$size1<-c() (i in 2:l) { if ( mtq$bid[i] == mtq$bid[i-1] | mtq$ofr[i] == mtq$ofr[i-1]) {mtq$size1=mtq$size[i]+mtq$size[i-1]} } it keeps saying argument length 0.
anyone has suggestion me?
ultimately, need follows:
size ofr bid size1 1 362.25 361.75 na 1 362.25 361.75 na 3 362.25 361.75 5 "(this 1+1+3)" 4 362.75 362 4 8 362.50 362 na 6 362.50 362 na 12 362.50 362 26 "(this 8+6+12)" 8 362.25 362 na 9 362.25 362 na 11 362.25 362 28 "(8+9+11)" then can drop nas , leave 4 rows @ end.
try
indx <- with(mtq, bid[-1]==bid[-length(bid)] | ofr[-1]==ofr[-length(ofr)] ) mtq$size1 <- with(mtq, c(na,ifelse(indx, size[-1]+size[-length(size)], na))) or using devel version of data.table i.e. v1.9.5. instructions install here
library(data.table)#v1.9.5+ setdt(mtq)[bid==shift(bid)|ofr==shift(ofr), size1 := size+shift(size, fill=0)] update
based on expected output
setdt(mtq)[, size1 := if(.n==1) size else c(rep(na, .n-1), sum(size)), list(gr=cumsum(shift(bid, fill=false)!= bid|shift(ofr, fill=false)!=ofr))] #size ofr bid size1 #1: 1 362.25 361.75 na #2: 1 362.25 361.75 na #3: 3 362.25 361.75 5 #4: 4 362.75 362.00 4 #5: 8 362.50 362.00 na #6: 6 362.50 362.00 na #7: 12 362.50 362.00 26 #8: 8 362.25 362.00 na #9: 9 362.25 362.00 na #10: 11 362.25 362.00 28 data
mtq <- structure(list(size = c(1l, 1l, 3l, 4l, 8l, 6l, 12l, 8l, 9l, 11l), ofr = c(362.25, 362.25, 362.25, 362.75, 362.5, 362.5, 362.5, 362.25, 362.25, 362.25), bid = c(361.75, 361.75, 361.75, 362, 362, 362, 362, 362, 362, 362)), .names = c("size", "ofr", "bid" ), class = "data.frame", row.names = c(na, -10l))
Comments
Post a Comment