r - 是否有与 plyr::join_all 等效的 dplyr 或 data.table?通过数据框列表加入?

标签 r data.table dplyr plyr

鉴于此data.frame:

set.seed(4)
df <- data.frame(x = rep(1:5, each = 2), y = sample(50:100, 10, T))
#    x  y
# 1  1 78
# 2  1 53
# 3  2 93
# 4  2 96
# 5  3 61
# 6  3 82
# 7  4 53
# 8  4 76
# 9  5 91
# 10 5 99

我想编写一些简单的函数(即特征工程)来为 x 创建特征,然后将每个生成的 data.frames 连接在一起。例如:

library(dplyr)
count_x <- function(df) df %>% group_by(x) %>% summarise(count_x = n())
sum_y   <- function(df) df %>% group_by(x) %>% summarise(sum_y = sum(y))
mean_y  <- function(df) df %>% group_by(x) %>% summarise(mean_y = mean(y))  
# and many more...

这可以通过 plyr::join_all 来完成,但我想知道是否有更好(或更高性能)的方法使用 dplyrdata.table

df_with_features <- plyr::join_all(list(count_x(df), sum_y(df), mean_y(df)),
                                   by = 'x', type = 'full')

# > df_with_features
#   x count_x sum_y mean_y
# 1 1       2   131   65.5
# 2 2       2   189   94.5
# 3 3       2   143   71.5
# 4 4       2   129   64.5
# 5 5       2   190   95.0

最佳答案

将 @SimonOHanlon 的 data.table 方法与 @Jaap 的 Reducemerge 技术相结合似乎会产生最高性能的结果:

library(data.table)
setDT(df)
count_x_dt <- function(dt) dt[, list(count_x = .N), keyby = x]
sum_y_dt   <- function(dt) dt[, list(sum_y = sum(y)), keyby = x]
mean_y_dt  <- function(dt) dt[, list(mean_y = mean(y)), keyby = x]

Reduce(function(...) merge(..., all = TRUE, by = c("x")), 
       list(count_x_dt(df), sum_y_dt(df), mean_y_dt(df)))

更新以包含 tidyverse/purrr (purrr::reduce) 方法:

library(tidyverse)
list(count_x(df), sum_y(df), mean_y(df)) %>% 
  reduce(left_join) 

关于r - 是否有与 plyr::join_all 等效的 dplyr 或 data.table?通过数据框列表加入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33895570/

相关文章:

R 将带有向量名称的函数应用于每一行

r - 如果已经有一个同名的函数,则定义一个 S4 方法

r - 将 RStudio 中的选择发送到终端的键盘快捷键

r - 当两个定界符在字符串中多次出现时,提取两个定界符之间的所有文本

r - dplyr:带管道的交叉表

r - %>% 运算符中的 dplyr 重复

r - For 循环 1) 提取并 2) 粘贴到 R 中的对象

r - 按组保留所有变量的最后一个非缺失观察

r - 使用 data.table 按组计算马氏距离(第二部分)

r - 选择 data.table 中不存在的列