【发布时间】:2016-02-27 00:10:15
【问题描述】:
鉴于此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 来完成,但我想知道dplyr 或data.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
【问题讨论】:
-
dplyr 格式为:
df %>% group_by(x) %>% summarise(count_x = n(), sum_y = sum(y), mean_y = mean(y))。一步完成所有列。 -
@jeremycg 当然可以,但想象一下更复杂的函数,我无法将所有内容都传递到一个语句中。
-
@JasonAizkalns 你能演示一下这不起作用吗?
-
@TylerRinker @jeremycg 实际上,只需查看 jeremy 的 blog post 示例(哈!我知道我无耻地从某个地方偷走了这个概念/想法……那会教您可以在深夜阅读 Kaggle 帖子...)。我将不得不稍微修改一下我的示例,但他的博客文章指出了调用
summarise不起作用的情况(或者至少是更难以维护的情况)。
标签: r data.table dplyr plyr