以下是我的数据样本的负责人。
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
我正在尝试实现一个for循环,以便在OFR[i]=OFR[i-1] & BID[i]= BID[i-1]
时总结SIZE。在新数据框中,行数会减少。
我目前的编码是:
L<-length(mtq$SIZE)
mtq$SIZE1<-c()
for (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]}
}
它一直说参数长度为0。
有人对我有什么建议吗?
最终,我需要的是:
SIZE OFR BID SIZE1
1 362.25 361.75 NA
1 362.25 361.75 NA
3 362.25 361.75 5 "(this is from 1+1+3)"
4 362.75 362 4
8 362.50 362 NA
6 362.50 362 NA
12 362.50 362 26 "(this is from 8+6+12)"
8 362.25 362 NA
9 362.25 362 NA
11 362.25 362 28 "(8+9+11)"
然后我可以放弃所有的NA,最后只留下4行。
答案 0 :(得分:1)
尝试
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)))
或使用devel
版本的data.table,即v1.9.5
。安装说明为here
library(data.table)#v1.9.5+
setDT(mtq)[BID==shift(BID)|OFR==shift(OFR), SIZE1 := SIZE+shift(SIZE, fill=0)]
基于预期输出
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
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))