2017-09-14 17 views
-1

と私は基本的なdplyrをしようとしています::組み込みn個の機能を持つDFに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_iffuns(n)を使用して欠けている任意の秘密?

+0

cbind'、 'data.frame'を期待していることができます。おそらく '長さ'? (おそらくあなたが望むものではない...あなたは単一の 'n'変数が必要だと思う...) – r2evans

+0

ありがとう@ r2evans、素晴らしい点。ああ、確かに、私は長さを試して、両方のエラーで数えます(長さは2つの引数を受け取ります)。 –

+0

@BenjaminGowan - 例えば 'len < - function(x、...)length(x)'など、他の引数を扱うことができる新しいlength()を作成する必要があります。それぞれの変数についてもそれが繰り返されます。 – thelatemail

答えて

0

2通りの方法で要約するのはシングルパス操作ではないと思います。 (1)行数(おそらくグループ単位)を要約したい。 (2)特定の列の特定の機能。 n()ヘルパー機能はフル-data.frameで使用されることが予想される傾向がありますが、funs(...)で特定された機能はすべて一度に1つのベクターに渡されます。

1つの方法は、必要なものをマージすることです。データを提供していないので、私は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)私はそれがより実証的であると思ったoそれらを壊す。 (2)時にはコードの明瞭さがコンパクトさよりも好ましい。しかし、%>% left_join(counts, by = "cyl")othersパイプラインの最後に追加することはできますが、明瞭さは失われません。

+1

ありがとうございます。私はスタックオーバーフローの新しいブランドです、私はすぐに答えとしてこれをマークしています! –

+1

(答えの左側にある投票の上下矢印のすぐ下にチェックマークがあるはずです) – r2evans

1

n()あなたが集計した情報を失うので、あなたは黙ってそれ

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

ハックソリューション

na.rm=TRUEを渡しているので、あなたの問題が発生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 

で作業することができますとは別に要約する必要がありますおよび(mean, median, max, min), na.rm=TRUE。 `低速運行(...)内の関数は`ベクトルを渡されるのに対し、あなたは)(nは `、結果残念ながら

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()'がベクトルを扱うことができます。 2番目の例は明確で、私はそれがうまくいくのに驚いていますが、私はそれがOPの要約の必要性を満たしているとは思いません。 – r2evans

+0

申し訳ありませんが、私はOPが単に説明を探していると思っていました。解決策を提供するために私の答えを編集しました。あなたは最初の例について正しいです。私はそれを削除しました。ありがとう! – CPak

関連する問題