在下面的变量中,我想将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.
答案 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))