2017-09-14 47 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