在下面的变量中,我想将 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。

最佳答案

我们可以使用 data.table 。我们将 'data.frame' 转换为 data.table' ( setDT(df1) ),通过检查 'A_B' 不等于 0 的位置来创建一个分组变量 ('grp') 以创建一个逻辑向量并获得累积和。按'grp'分组,我们设置'grp'不等于0的'i',创建'A_B'不为0的逻辑向量'i1'。获取'i1'的sum,使用pmin得到与 4 比较时的最小值。然后我们根据 'i1' 对 'A_B' 进行子集化,并与 'i2' 进行整数除法。我们按'grp'分组,根据逻辑条件得到行索引('.I'),然后将'A_BnewNew'赋值为0。如果不需要,'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))

关于r - 如何将行数据拆分到其他行下方,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38259506/

10-12 17:22