gpt4 book ai didi

r - 如何将行数据拆分到其他行下方

转载 作者:行者123 更新时间:2023-12-04 10:14:20 25 4
gpt4 key购买 nike

在下面的变量中,我想将 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'分组,我们设置'i'其中'grp'不等于0,创建逻辑向量'i1'其中'A_B'不为0。得到'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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com