我希望能够使用dplyrsplit-apply-combine策略来应用summary()命令.
拿一个简单的数据框:
df <- data.frame(class = c('A', 'A', 'B', 'B'),
value = c(100, 120, 800, 880))
Run Code Online (Sandbox Code Playgroud)
理想情况下,我们会这样做:
df %>%
group_by(class) %>%
do(summary(.$value))
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用.有任何想法吗?
您可以使用SE版本data_frame,即data_frame_执行:
df %>%
group_by(class) %>%
do(data_frame_(summary(.$value)))
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用带参数的as.list()wrapped data.frame()with check.names = FALSE:
df %>%
group_by(class) %>%
do(data.frame(as.list(summary(.$value)), check.names = FALSE))
Run Code Online (Sandbox Code Playgroud)
两个版本都产生:
# Source: local data frame [2 x 7]
# Groups: class [2]
#
# class Min. 1st Qu. Median Mean 3rd Qu. Max.
# (fctr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
# 1 A 100 105 110 110 115 120
# 2 B 800 820 840 840 860 880
Run Code Online (Sandbox Code Playgroud)
问题是这dplyr仅do()适用于表单的输入data.frame。
broom包的tidy()函数可用于转换summary()to的输出data.frame。
df %>%
group_by(class) %>%
do( tidy(summary(.$value)) )
Run Code Online (Sandbox Code Playgroud)
这给出:
Source: local data frame [2 x 7]
Groups: class [2]
class minimum q1 median mean q3 maximum
(fctr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
1 A 100 105 110 110 115 120
2 B 800 820 840 840 860 880
Run Code Online (Sandbox Code Playgroud)