我正在使用内置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)
时遗漏了什么秘密?
答案 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
这当然可以一举完成,而不是创建中间变量counts
和others
,但是(1)我认为将它们分解出来更具说明性; (2)有时代码的清晰度优于紧凑性。但是,可以将%>% left_join(counts, by = "cyl")
添加到others
管道的末尾,但不会失去清晰度。