【发布时间】:2018-05-08 09:09:30
【问题描述】:
假设我有以下数据框(注意'score'的长度):
id = 1:10^8
school = LETTERS[1:10]
class = paste0(school, rep(1:10, each=10))
score = rnorm(10^8)
df = data.frame(id, school, class, score,
stringsAsFactors = FALSE)
我想计算 100 个类中每个类的平均值。然而,我也想要 在结果中保留学校变量。使用 dplyr:
df %>% group_by(class) %>%
summarise(mean = mean(score),
school = unique(school))
这可行,但速度很慢(在我的机器上 8 秒,实际上我的数据要大得多)。我认为一个选项可能不是使用 unique() 而是使用 join() 家族的成员。但我需要先定义另一个 df 如下:
df_join = data.frame(class, school,
stringsAsFactors = FALSE)
然后:
df %>% group_by(class) %>%
summarise(mean = mean(score)) %>%
left_join(df_join)
这很有效,而且速度较慢,因为现在需要 6 秒。然而,在这里创建 df_join 很容易,因为我发明了数据框,但在现实生活中,获得 df_join 可能更具挑战性。所以我想只使用原始数据框(df)。
有什么想法可以让 dplyr 更轻松(也许更快)吗? (我查了一下,没有找到解决办法:Aggregate by factor levels, keeping other variables in the resulting data frame)
【问题讨论】:
-
使用
df %>% group_by(school, class) %>% summarize(...)
标签: r statistics dplyr data-manipulation summary