使用内置函数的n与summarize_if
我试图在与内置n功能一个DF基本dplyr :: summarize_if:使用内置函数的n与summarize_if
###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(.)
(这当然不期望工作,不)。
任何秘密,我缺少的summarise_if
使用funs(n)
?
我不认为这是一种通过两种不同方式总结的单程操作。你想总结(1)行数(可能是每个组);和(2)某些列的特定功能。 n()
辅助函数倾向于期望在full- 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)我认为这将是更具说服力的t把它们打破;和(2)代码的清晰度有时比紧凑更受欢迎。但是,可以将%>% left_join(counts, by = "cyl")
添加到others
管道的末端,但不会损失清晰度。
非常感谢。我是堆栈溢出的全新,我很快就把它作为答案标记出来! –
(答案左侧应该有一个复选标记,紧接在投票向上/向下箭头的下方)。 – r2evans
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
不幸的是,'N()'期待一个'data.frame',而函数中'玩意儿(...)'将被传递的载体。也许'长度'? (可能不是你想要的...你想单个'n'变量,我认为...) – r2evans
谢谢@ r2evans,很棒的一点。唉,的确,我尝试了一段时间,并且还计算了两者的错误(长度表示它收到两个参数)。 –
@BenjaminGowan - 你需要创建一个新的'length()'来处理(和忽略)其他参数 - 例如'len thelatemail