Loop R的更好替代品

时间:2018-07-18 04:11:17

标签: r for-loop

我根据此标准将值存储在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循环是否有其他替代方法可以更快地完成我正在做的事情。预先感谢。

2 个答案:

答案 0 :(得分:7)

首先,始终最好提供一些示例数据和匹配的预期输出以说明您想要实现的目标。这将使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^6a的{​​{1}}个条目组成。

b

enter image description here

答案 1 :(得分:0)

高级编程语言中的

循环始终是大型操作的问题。除了您熟悉的C++之外,还可以使用Maurits答案,还可以使用rcpp包为c++编译R代码,这要快得多。 此外,print中的C++(作为进度淋浴)比纯R打印更为理想。 See Example

您还可以将R(数值向量和矩阵)转换为C++11 std <std>向量,并使用并行处理(如果您的硬件支持)以更好地利用硬件。 / p>