首页 > 解决方案 > Loop R 的更好替代方案

问题描述

我根据此标准在 c 列中存储一个值。我的数据框中有 400 万行,这需要 2 天才能完成。

for ( i in 1:NROW(df)) {
  df$c[i+1] <- df$a[i] + df$b[i] - df$a[i+1]
  print(i)
}

这个for循环是否有任何替代方法可以更快地完成我正在做的事情。提前致谢。

标签: rfor-loop

解决方案


首先,最好提供一些示例数据和匹配的预期输出来说明您想要实现的目标。这将使 SO 社区更容易提供帮助。

除此之外,你可以使用dplyr::lag

library(dplyr)
df <- mutate(df, c = lag(a) + lag(b) - a)

这是基于我创建的示例数据的示例

# Sample data
df <- data.frame(
    a = 1:10,
    b = 11:20)

df <- mutate(df, c = lag(a) + lag(b) - a)
df
#    a  b  c
#1   1 11 NA
#2   2 12 10
#3   3 13 11
#4   4 14 12
#5   5 15 13
#6   6 16 14
#7   7 17 15
#8   8 18 16
#9   9 19 17
#10 10 20 18

你确实可以确认c[i+1] = a[i] + b[i] - a[i+1]


基准分析

让我们从性能/运行时的角度来比较以下三种方法

  1. 使用dplyr::lagdplyr::mutate
  2. 使用基础 R(感谢@nicola),
  3. 使用data.table::shift

我们使用由和的10^6条目组成的样本数据。ab

set.seed(2017)
df <- data.frame(
    a = sample(100, 10^6, replace = T),
    b = sample(100, 10^6, replace = T))

library(microbenchark)
res <- microbenchmark(
    method_lag = {
        df <- mutate(df, c = lag(a) + lag(b) - a)
    },
    method_base = {
        df$c <- NA
        df$c[-1] <- df$a[-nrow(df)] + df$b[-nrow(df)] - df$a[-1]
    },
    method_shift = {
        df$c <- shift(df$a) + shift(df$b) - df$a
    })
#Unit: milliseconds
#         expr      min       lq     mean   median        uq       max neval cld
#   method_lag 19.88495 21.81414 29.30085 23.83718  26.61746 107.04355   100  b
#  method_base 51.00888 56.29822 90.05291 60.65321 128.79227 208.80537   100   c
# method_shift 10.86351 12.51993 18.34094 14.24705  16.88488  92.83246   100 a

autoplot(res)

在此处输入图像描述


推荐阅读