如何将行数据溢出到其他行以下

时间:2016-07-08 05:34:23

标签: r

在下面的变量中,我想将900000分成低于其各自存在零的三行,类似于其他值。在新值到达之前动态计算的零数。 A_B是数据,A_Bnew是所需的输出。请告诉我如何在R中完成。

A_B    A_Bnew
0      0
0      0
900000 0
0      300000
0      300000
0      300000
10000  0
0      5000
0      5000
20000  0
0      5000
0      5000
0      5000
0      5000
0      0
0      0
0      0

它应该考虑拆分的最大零数是4.

1 个答案:

答案 0 :(得分:3)

我们可以使用data.table。我们转换了' data.frame'到data.table' (setDT(df1)),通过检查A_B'的位置来创建分组变量(' grp')。不等于0来创建逻辑向量并获得累积和。通过' grp'分组,我们设置了' i'在哪里' grp'不等于0,创建逻辑向量' i1'其中' A_B'不是0.获取' i1'的sum,并使用pmin获得与4比较时的最小值。然后我们将' A_B'基于' i1'并使用' i2'进行整数除法。我们按' grp'分组,根据逻辑条件获取行索引(' .I`),然后分配' A_BnewNew'如果不需要的话,那就是' grp'可以指定为NULL。

library(data.table)
iN <- setDT(df1)[, grp := cumsum(A_B!=0)][grp!=0, A_BnewNew := {
           i1 <- A_B!=0; i2 <- pmin(sum(!i1),4)
           A_B[i1]%/%i2}  , by = grp
       ][, .I[!(A_B ==0 & grp !=0 & (1:.N) <= pmin(5, .N))]  , by = grp]$V1
 df1[iN, A_BnewNew:=0][, grp := NULL][]
#       A_B A_Bnew A_BnewNew
# 1:      0      0         0
# 2:      0      0         0
# 3: 900000      0         0
# 4:      0 300000    300000
# 5:      0 300000    300000
# 6:      0 300000    300000
# 7:  10000      0         0
# 8:      0   5000      5000
# 9:      0   5000      5000
#10:  20000      0         0
#11:      0   5000      5000
#12:      0   5000      5000
#13:      0   5000      5000
#14:      0   5000      5000
#15:      0      0         0
#16:      0      0         0
#17:      0      0         0

数据

df1 <- structure(list(A_B = c(0L, 0L, 900000L, 0L, 0L, 0L, 10000L, 0L, 
 0L, 20000L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), A_Bnew = c(0L, 0L, 0L, 
 300000L, 300000L, 300000L, 0L, 5000L, 5000L, 0L, 5000L, 5000L, 
 5000L, 5000L, 0L, 0L, 0L)), .Names = c("A_B", "A_Bnew"), 
 class = "data.frame", row.names = c(NA, -17L))