【发布时间】:2016-12-22 04:40:46
【问题描述】:
我对 R 编程比较陌生,我试图弄清楚如何使用自定义函数以内存有效的方式使用 dplyr 或 data.table 评估数据帧的新列。有人可以帮忙吗
这里是我的问题的简要总结
数据框 1 和 2 具有相同的类型和列数
df1 <- data.frame(col1 = c("A", "B", "C"), col2 = c(10,20,30))
df2 <- data.frame(col1 = c("DA", "EE", "FB", "C"), col2 = c(10,20,30,40))
这些数据帧有数百万条记录。
现在我想通过使用 df2 中的值向其中一个数据框(例如 df1)添加一个新列。
library(dplyr)
calculateCol3 <- function(word) {
df2 %>%
filter(grepl(paste0(word, "$"),col1) )%>%
summarize(col3= sum(col2))
col3
}
df1 %>% group_by(col1) %>% mutate(col3 = calcualteCol3(col1))
此方法有效,但速度非常慢,我猜这是因为复制数据集的次数过多。有人可以提出更好的方法吗?预期结果是:
col1 col2 col3
A 10 10
B 20 30
C 30 40
我也尝试将数据框转换为 data.table,如下所示
dt1 <- data.table(df1)
dt2 <- data.table(df2)
dt1[, col3 := calculateCol3(col1)}, by = 1:nrow(dt1)]
一切似乎都很慢。我确信有更好的方法来实现这一点。有人可以帮忙吗
谢谢
【问题讨论】:
-
是的,作为一般规则,您应该尝试编写您的函数,以便不需要单独应用 NROW。 (我不清楚你的函数应该做什么,所以我无法提供更具体的帮助。)
-
您的示例代码根本不起作用。
-
df3 = grepl(paste0(word, '$'), df2$col1))应该是二进制TRUE/FALSE。你希望df3$col2表现如何? -
我已经编辑了函数。我希望结果如下
-
我已经编辑了函数。我希望结果如下 head(df1) col1 col2 col3 A 10 10 B 20 30 C 30 40
标签: r data.table dplyr