我希望能够使用dplyr
的分割-应用-组合策略来应用summary()
命令。
以一个简单的数据框为例:
df <- data.frame(class = c('A', 'A', 'B', 'B'),
value = c(100, 120, 800, 880))
理想情况下,我们会做出这样的操作:
df %>%
group_by(class) %>%
do(summary(.$value))
很遗憾,这并不起作用。有什么想法吗?
data_frame_
这个 SE 版本的数据框,然后执行以下操作:df %>%
group_by(class) %>%
do(data_frame_(summary(.$value)))
或者,您可以使用as.list()
包裹data.frame()
,参数为check.names = FALSE
:
df %>%
group_by(class) %>%
do(data.frame(as.list(summary(.$value)), check.names = FALSE))
# 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
dplyr
的 do()
只能处理 data.frame
格式的输入。tidy()
函数将 summary()
的输出转换为 data.frame
格式。df %>%
group_by(class) %>%
do( tidy(summary(.$value)) )
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
do
函数的行为取决于你给它命名参数还是未命名参数。对于未命名参数,它期望每个组都有一个数据框,这些数据框将被合并在一起。对于命名参数,它将为每个组创建一行,并将输出放入新的变量中。summary
不会产生数据框),但如果使用命名参数则可以正常工作。df %>%
group_by(class) %>%
do(summaries = summary(.$value)) ->
df2
这将会得到:
Source: local data frame [2 x 2]
Groups: <by row>
class summaries
(fctr) (chr)
1 A <S3:summaryDefault, table>
2 B <S3:summaryDefault, table>
df2$summaries[[1]]
提供:
Min. 1st Qu. Median Mean 3rd Qu. Max.
100 105 110 110 115 120
df
的新列获取,只能通过首先将输出转换为data.frame来完成,如其他答案中所示。summary
输出的是一个table
而不是data.frame。tidy()
函数。但给它命名是一个非常简单的避免方法。 - Bastiaan Quast
tidy()
的方法。请参见下文。 - Bastiaan Quastdata_frame
和data_frame_
来自于dplyr
。顺便说一下,就我而言,这个答案值得打勾。 - Axeman