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