使用带有summarize_if的内置函数n

时间:2017-09-14 22:50:58

标签: r dplyr

我正在使用内置n函数在df上尝试基本的dplyr :: summarize_if:

/usr/sbin/crond -f -l 2 -L /var/log/cron.log
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf


###Seems like this should work
df %>% summarise_if(is.numeric, funs(n, mean, sd, min, max), na.rm = TRUE)  

Error in summarise_impl(.data, dots) : `n()` does not take arguments

我已经尝试了###Works fine without the n df %>% summarise_if(is.numeric, funs(mean, sd, min, max), na.rm = TRUE) A tibble: 1 x 104 n()(这当然不会发挥作用,也不会发挥作用)。


我在n(.)使用funs(n)时遗漏了什么秘密?

2 个答案:

答案 0 :(得分:2)

n()可以在summarise_if

中使用
 mtcars %>% summarise_if(is.numeric, funs(n()))

  # mpg cyl disp hp drat wt qsec vs am gear carb
# 1  32  32   32 32   32 32   32 32 32   32   32

您的问题出现是因为您默默地将na.rm=TRUE传递给它

mtcars %>% summarise_if(is.numeric, funs(n(na.rm=TRUE)))
# Error in summarise_impl(.data, dots) : `n()` does not take arguments

黑客解决方案

由于您在汇总时丢失了信息,因此您需要使用n()(mean, median, max, min), na.rm=TRUE进行独立汇总。您可以cbind结果

N <- mtcars %>% summarise_if(is.numeric, funs(n()))
stats <- mtcars %>% summarise_if(is.numeric, funs(mean, median, max, min), na.rm=TRUE)
cbind(N,stats)

  # mpg cyl disp hp drat wt qsec vs am gear carb mpg_mean cyl_mean disp_mean  hp_mean drat_mean wt_mean qsec_mean vs_mean am_mean
# 1  32  32   32 32   32 32   32 32 32   32   32 20.09062   6.1875  230.7219 146.6875  3.596563 3.21725  17.84875  0.4375 0.40625
  # gear_mean carb_mean mpg_median cyl_median disp_median hp_median drat_median wt_median qsec_median vs_median am_median
# 1    3.6875    2.8125       19.2          6       196.3       123       3.695     3.325       17.71         0         0
  # gear_median carb_median mpg_max cyl_max disp_max hp_max drat_max wt_max qsec_max vs_max am_max gear_max carb_max mpg_min
# 1           4           2    33.9       8      472    335     4.93  5.424     22.9      1      1        5        8    10.4
  # cyl_min disp_min hp_min drat_min wt_min qsec_min vs_min am_min gear_min carb_min
# 1       4     71.1     52     2.76  1.513     14.5      0      0        3        1     

答案 1 :(得分:1)

我不认为这是一次单行操作,以两种不同的方式进行总结。您想要总结(1)行数(可能是每组); (2)某些列的特定功能。 n()辅助函数倾向于在完整 - data.frame 上使用,而funs(...)中标识的函数将一次传递一个向量

一种方法是合并/加入你需要的东西。由于您没有提供数据,我将使用mtcars。虽然你没有提到分组,但我猜测可能有群组(虽然它并不会使事情变得复杂),所以我也会注意到这一点:

library(dplyr)
counts <- select(mtcars, cyl, mpg, wt) %>%
  group_by(cyl) %>%
  count()
counts
# # A tibble: 3 × 2
#     cyl     n
#   <dbl> <int>
# 1     4    11
# 2     6     7
# 3     8    14

count()本质上是summarize(n = n())的快捷方式。这可以通过select(mtcars, cyl, mpg, wt) %>% count(cyl)轻松完成,但我希望分组能够明确地回答这个问题。)

others <- select(mtcars, cyl, mpg, wt) %>%
  group_by(cyl) %>%
  summarise_if(is.numeric, funs(mean, sd))
others
# # A tibble: 3 × 5
#     cyl mpg_mean  wt_mean   mpg_sd     wt_sd
#   <dbl>    <dbl>    <dbl>    <dbl>     <dbl>
# 1     4 26.66364 2.285727 4.509828 0.5695637
# 2     6 19.74286 3.117143 1.453567 0.3563455
# 3     8 15.10000 3.999214 2.560048 0.7594047

left_join(counts, others, by = "cyl")
# # A tibble: 3 × 6
#     cyl     n mpg_mean  wt_mean   mpg_sd     wt_sd
#   <dbl> <int>    <dbl>    <dbl>    <dbl>     <dbl>
# 1     4    11 26.66364 2.285727 4.509828 0.5695637
# 2     6     7 19.74286 3.117143 1.453567 0.3563455
# 3     8    14 15.10000 3.999214 2.560048 0.7594047

这当然可以一举完成,而不是创建中间变量countsothers,但是(1)我认为将它们分解出来更具说明性; (2)有时代码的清晰度优于紧凑性。但是,可以将%>% left_join(counts, by = "cyl")添加到others管道的末尾,但不会失去清晰度。