r - 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循环是否有任何替代方法可以更快地完成我正在做的事情。提前致谢。
解决方案
首先,最好提供一些示例数据和匹配的预期输出来说明您想要实现的目标。这将使 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]
。
基准分析
让我们从性能/运行时的角度来比较以下三种方法
- 使用
dplyr::lag
和dplyr::mutate
- 使用基础 R(感谢@nicola),
- 使用
data.table::shift
我们使用由和的10^6
条目组成的样本数据。a
b
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)
推荐阅读
- jenkins-plugins - 在 Jenkins 上配置 Groovy
- go - goimports 未检测到本地包
- stripe-payments - 如何在 Stripe 中一次为多个项目充电?
- javascript - Navbar 中的新组件,React
- spring-boot - Spring Boot 社交 Twitter 身份验证失败
- python - 将嵌套字典中出现的所有类型提升到顶级键
- android - Flutter , IconButton 在使用对齐或边距或填充时不起作用
- python - 使用请求通过 python3 登录网站(Mediawiki)
- php - 填充了多个 sql 答案的多维数组
- javascript - 事件处理程序继续调用早于动画函数