【发布时间】:2017-07-01 19:12:12
【问题描述】:
我想为 B 列的那些行找到前面的 cumsum(即 cumsum 减去当前行),直到 A 列的前几行(包括当前行)的总和为
我能够使用传统的 for 循环找到答案。矢量化实现将非常有帮助,因为我需要在大型数据集上运行它。分享我的简单代码以防万一。
dt <- data.frame(A = c(0, 2, 3, 5, 8, 90, 8, 2, 4, 1, 2),
B = c(1, 0, 4, 2, 3, 4, 2, 1, 2, 3, 1),
Ans = c(0, 1, 1, 4, 0, 0, 0, 2, 3, 5, 6),
new=rep(0,11))
dt3 <- dt
for (i in 2:nrow(dt3)){
set<-0
count<-0
k=i-1
for (j in k:1){
count=count+dt3$A[j+1]
if(count<=7){
set<-set+dt3$B[j]
if(j==1){
dt3$new[i]=set
}
}
else{
dt3$new[i]=set
}
}
}
以下是要满足的三个条件:
- 如果 A > 7,则 Ans 重置为 0
- 如果 cumsum(A)
- 如果 cumsum(A) > 7,则 Ans 是 lagB 的 cumsum(),用于 A 的先前行的范围,其总和为
这是数据的简化版本(A 列和 B 列),所需的输出是 Ans 列:
dt <- data.frame(A = c(0, 2, 3, 5, 8, 90, 8, 2, 4, 1, 2),
B = c(1, 0, 4, 2, 3, 4, 2, 1, 2, 3, 1),
Ans = c(0, 1, 1, 4, 0, 0, 0, 2, 3, 5, 6))
dt
A B Ans Reason for value in Ans:
1 0 1 0 There are no preceeding rows in B so Ans is 0
2 2 0 1 Sum of value of A from row 2 to 1 is 2 <=7. So Ans is the value of B from first row = 1
3 3 4 1 Sum of value of A from row 3,2 and 1 is 5 <=7. So Ans is the sum of value of B in row 1 and 2, which is 1.
4 5 2 4 Value of A from row 4 is 5 which is <=7. So Ans is value of B from row 3, which is 4
5 8 3 0 Value of A in row 5 is 8 which is >7. So Ans is 0 (Value of Ans resets to 0 when A > 7).
6 90 4 0
7 8 2 0
8 2 1 2 Value of A in row 8 is 2 which <=7, so Ans is value of B in row 7 which is 2
9 4 2 3 Sum of value of A from row 9 and 8 is 6<=7, so Ans is sum of value of B in row 8 and 7 = 3
10 1 3 5 Sum of value of A from row 10,9 and 8 is 7<=7, so Ans is sum of value of B in row 9,8 and 7 =5.
11 2 1 6 Sum of value of A from row 11,10 and 9 is 7<=7, so Ans is sum of value of B in row 10,9 and 8 =6.
任何关于如何在 R 中编码的帮助?
【问题讨论】:
-
我已将您的 scrfeenshot 替换为生成数据框的代码。下次,请不要使用屏幕截图来显示您的数据。提供可重现的示例数据集。
-
感谢您的信息!下次会记住的
-
这些反对意见可能部分是由于早期的屏幕截图。我已经解决了。现在也许您可以进一步阐明预期输出的逻辑。我猜有些人无法理解您的逻辑,所以他们给了您反对票。如果你能逐行解释为什么 Ans 中的每个数字都是这样的,这将很有帮助,也许直到第 5 行。
-
为什么第 9 行和第 10 行中的
Ans等于3,5? -
我刚刚看到你更新的解释。这真的让我很困惑。为什么在第 4 行中只添加 A 列中的第 3 行和第 4 行。但是对于第 9 行和第 10 行,您从第 8 行开始使用
cumsum?