【问题标题】:Cleverer way to avoid looping over dataframe?避免循环数据帧的更聪明的方法?
【发布时间】:2017-03-02 22:43:48
【问题描述】:

我正在寻找一种更聪明、希望更快的方法来遍历数据帧的行:

鉴于这样的数据框:

d <- data.frame(x=1:10, y=rep(NA,10))

我希望第 i 行的“y”列是 x 的第 i 个和第 (i-1) 个值的总和:

y[i] = x[i] + x[i-1]

在R中:

for( i in 1:nrow(d)) d$y[i] <- ifelse( i>1, d$x[i] + d$x[i-1], d$x[i])

但是在 R 中循环数据帧从来都不是最好的主意,dply 或 lapply 可以处理这种情况吗?

【问题讨论】:

  • 阅读dplyr lead/lag函数。
  • 嗯....d$x + c(NA,d$x[-10])?
  • d$x + c(0, d$x[-10])
  • 灵活的说法,也可以概念化为线性滤波器stats::filter(c(0,d$x), c(1,1), sides=1)[-1]
  • 仅供参考,lapply 正在循环遍历数据框。

标签: r loops dataframe dplyr


【解决方案1】:

这是使用sapply的一种方法

sapply(1:nrow(d), function(i) sum(d$x[(i-1):i]))
# [1]  1  3  5  7  9 11 13 15 17 19

另一个使用rollsumzoo

library(zoo)
rollsum(x = d$x, k = 2, align = 'right', fill = d$x[1])
# [1]  1  3  5  7  9 11 13 15 17 19

【讨论】:

    【解决方案2】:

    我的经验是 Ulrich 的包 TTR 非常适合这项任务

    d <- data.frame(x=1:10)
    d$y <- TTR::runSum(d$x,n=2)
    

    【讨论】:

      猜你喜欢
      • 2014-04-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多