如何在R中有选择地总结行?

时间:2015-05-31 03:55:35

标签: r

以下是我的数据样本的负责人。

         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行。

1 个答案:

答案 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))