2017-07-31 1 views
1

複数の列のトップリストを取得する方法:私が選択して、単一の列を手配することができます

iris %>% 
    select(Petal.Width, Species) %>% 
    arrange(desc(Petal.Width)) 

しかし、私は全体のデータフレームのためにこれをやってみたいです。私はforloopでこれに近づいています:

features <- colnames(iris) 
top <- data.frame() 
for (i in 1:length(features)) { 
    label <- features[[i]] 
    iris %>% 
    select(label, Species) %>% 
    arrange(desc(label)) %>% 
    top_n(3) %>% 
    rbind(top) 
} 
# Error in arrange_impl(.data, dots) : 
# incorrect size (1) at position 1, expecting : 150 

私にエラーが発生します。

明らかにarrange(desc(label))は機能しません。私は検索してUQsubstituteのようなものを試して、labelを引用符で囲みましたが、結果はありません。

rbind(top)top_nエンドも、私が望んでいない正確に何であるかもしれないが、私は今持っている主な問題はそうforloopはそれを受け入れるウィルlabelを使用する方法です。

そしておそらく誰かが私のalltogether forloopより良いアプローチを知っている...

所望の出力は、すべての列の上部3と、データフレームです。

答えて

2

すべての列で何かを使用する場合は、複数の方法があります。私はgather(または融解)のデータを最初にしてからdplyrをもう一度使います。

たとえば、あなたのケースで、これは何を参照してください


library(tidyr) 
library(dplyr) 

iris %>% 
    gather("var", "val", -Species) %>% 
    group_by(var) %>% 
    arrange(desc(val)) %>% 
    top_n(3) 
#> Selecting by val 
#> # A tibble: 14 x 3 
#> # Groups: var [4] 
#>  Species   var val 
#>  <fctr>  <chr> <dbl> 
#> 1 virginica Sepal.Length 7.9 
#> 2 virginica Sepal.Length 7.7 
#> 3 virginica Sepal.Length 7.7 
#> 4 virginica Sepal.Length 7.7 
#> 5 virginica Sepal.Length 7.7 
#> 6 virginica Petal.Length 6.9 
#> 7 virginica Petal.Length 6.7 
#> 8 virginica Petal.Length 6.7 
#> 9 setosa Sepal.Width 4.4 
#> 10 setosa Sepal.Width 4.2 
#> 11 setosa Sepal.Width 4.1 
#> 12 virginica Petal.Width 2.5 
#> 13 virginica Petal.Width 2.5 
#> 14 virginica Petal.Width 2.5 

につながることtop_nが上位n個の値ではない上位n個のエントリを選択したということですが、あなたは置き換えることができますslice(1:3)の機能

あなたが探しているものはありますか?

+1

偉大な答え。マイナーな追加: 'slice(1:3) 'を使用して各グループの上位3つのエントリを選択すると、その結果をさらに' spread'に渡してdata.frameを元のワイドフォーマットに戻すことができます。 –

+2

嬉しいです。値を再び広げるためには、何らかの識別子を持っていなければなりません。それ以外の場合は重複した識別子があるので拡散が止まります...しかしそうでなければ正しいです。 – David

+0

うん、それは働いた!どうもありがとう! – raoul

関連する問題