【发布时间】:2014-03-07 19:17:18
【问题描述】:
由于这是我第一次在 SO 上提出问题,对于任何格式不当,我提前道歉。
我对 R 非常陌生,我正在尝试创建一个函数,一旦另一列中的运行总计达到或超过给定值(运行总和开始的行),该函数将返回数据框列的行值也是一个论点)。
例如,给定下面的数据框,如果给定一个起始参数x=3,终止参数y=17,函数应该返回5(y之和>=17所在行的x值) .
X Y
1 5
2 10
3 5
4 10
5 5
6 10
7 5
8 10
我目前编写的函数返回正确答案,但我必须相信有一种更“R-ish”的方式来完成此任务,而不是使用循环和递增临时变量,并且希望学习正确的方法,而不是养成以后必须改正的坏习惯。
一个非常简化的函数版本:
myFunction<-function(DataFrame,StartRow,Total){
df<-DataFrame[DataFrame[[1]] >= StartRow,]
i<-0
j<-0
while (j < Total) {
i<-i+1
j<-sum(df[[2]][1:i])
}
x<-df[[1]][i]
return(x)
}
【问题讨论】:
-
我可能会说,在这里使用
while或break循环可能确实很有帮助,因为您希望事件第一次发生(尤其是对于大向量和早期发生)。您还可以避免一次又一次地计算j,而是在循环中递增它。 -
我下面的解决方案使用@alexis_laz 的打破循环的解决方案,并且基准测试确实表明它有助于大向量和早期出现。由于 R 中的循环效率低下,因此我使用 Rcpp 进行此计算。
标签: r loops cumulative-sum