2017-09-14 39 views
-1

我试图在与内置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)

+0

不幸的是,'N()'期待一个'data.frame',而函数中'玩意儿(...)'将被传递的载体。也许'长度'? (可能不是你想要的...你想单个'n'变量,我认为...) – r2evans

+0

谢谢@ r2evans,很棒的一点。唉,的确,我尝试了一段时间,并且还计算了两者的错误(长度表示它收到两个参数)。 –

+0

@BenjaminGowan - 你需要创建一个新的'length()'来处理(和忽略)其他参数 - 例如'len < - function(x,...)length(x)'。虽然它仍然会重复每个变量。 – thelatemail

回答

0

我不认为这是一种通过两种不同方式总结的单程操作。你想总结(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 

这当然可以在一下跌,一举完成的,而不是建立在中间变量countsothers,但(1)我认为这将是更具说服力的t把它们打破;和(2)代码的清晰度有时比紧凑更受欢迎。但是,可以将%>% left_join(counts, by = "cyl")添加到others管道的末端,但不会损失清晰度。

+1

非常感谢。我是堆栈溢出的全新,我很快就把它作为答案标记出来! –

+1

(答案左侧应该有一个复选标记,紧接在投票向上/向下箭头的下方)。 – r2evans

1

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  
+0

你的第一个例子并没有证明'n()'可以处理向量。第二个例子更加清晰,虽然我感到惊讶,但它的确如此,我认为它不符合OP的总结需求。 – r2evans

+0

对不起,我以为OP只是在寻找一个解释。我编辑了我的答案以提供解决方案。你是对的第一个例子。我删除了它。谢谢! – CPak