使用dplyr的do()和summary()

Bas*_*ast 5 r summary dplyr

我希望能够使用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)

不幸的是,这不起作用.有任何想法吗?

Jas*_*lns 5

您可以使用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)

  • `data_frame`和`data_frame_`来自`dplyr`.顺便说一句,就我而言,这个答案值得勾选. (3认同)

Bas*_*ast 4

问题是这dplyrdo()适用于表单的输入data.frame

broomtidy()函数可用于转换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)