2016-04-13 8 views
0

gatherの機能を理解する際に問題が発生しました。tidyrです。私は列brown:otherを取得し、それらを一つの変数にするために整理でギャザー機能を理解する問題

tidyv1 <- data.frame(name=c("Jake","Alice","Tim","Denise"), 
       age=c(34,55,76,19), 
       brown=c(0,0,1,0), 
       blue=c(0,1,0,0), 
       other=c(1,0,0,1), 
       height=c(6.1,5.9,5.7,5.1)) 

たい:私は、次のデータフレームを持っています。ここに私のコードは次のとおりです。

tidyc1 <- gather(tidyv1, key=eye_color, value=val, brown:other, factor_key=TRUE) 

結果がこれです:

 name age height eye_color val 
1 Jake 34 6.1  brown 0 
2 Alice 55 5.9  brown 0 
3  Tim 76 5.7  brown 1 
4 Denise 19 5.1  brown 0 
5 Jake 34 6.1  blue 0 
6 Alice 55 5.9  blue 1 
7  Tim 76 5.7  blue 0 
8 Denise 19 5.1  blue 0 
9 Jake 34 6.1  other 1 
10 Alice 55 5.9  other 0 
11 Tim 76 5.7  other 0 
12 Denise 19 5.1  other 1 

私は期待してい結果がこれです:

name age eye_color height 
1 Jake 34  other 6.1 
2 Alice 55  blue 5.9 
3 Tim 76  brown 5.7 
4 Denise 19  other 5.1 

私は簡単に修正することができることを知っています余分なコードで、私は直接的な方法があるかどうかを理解したい。例えば:

tidyc1[which(tidyc1[,5]==1),1:4] 
+0

「ギャザリング」に直接的な方法が組み込まれているとは思わない。しかし、 '0'ではなく' NA'があった場合は、 'na.rm'引数のためにもっと近づくでしょう。 – aosmith

答えて

2

gatherを別に1行の値に列名を溶融することによってデータを再配置するが、データをドロップしません。 tidyv1には、人々がの特定の目の色とそれ以外の色を持っていないことを伝えるデータがあり、そのすべてがgatherによって保持されています。 NAを代わりに使用している場合は、na.rm = TRUEを使用できますが、それでも余分なval列が使用されます。

したがって、gather自体は、あなたが望むものを直接実行するものではありません。

library(dplyr) 
tidyv1 %>% gather(key=eye_color, value=val, brown:other, factor_key=TRUE) %>% 
    filter(val == 1) %>% select(-val) 

を...またはちょうどdplyrで全体の動作を実行します:あなたは

dplyr
tidyc1[tidyc1$val == 1, -5] 

...またはインラインで事実の後にクリーンアップすることができ

tidyv1 %>% rowwise() %>% 
    mutate(eye_color = c('brown', 'blue', 'other')[which(c(brown, blue, other) == 1)]) %>% 
    select(-brown:-other) 

。またはベース:

tidyv1$eye_color <- apply(tidyv1[,c('brown', 'blue', 'other')], 1, 
          function(x){c('brown', 'blue', 'other')[x == 1]}) 
tidyv1 <- tidyv1[,-3:-5] 

あなたはどちらを使用していても同じことになりますので、好みのものを選んでください。

+0

ありがとう、これは非常に役に立ちます。 –

関連する問題