2017-03-24 5 views
0

私はおもちゃのデータフレームを持っています。私は複数のカテゴリを集めたいと思っていますが、私はわずか3つのidで終わるはずです。言い換えれば、idの列には同じ番号の3つのリピートしかないはずです。複数のギャザー()をdplyrで長さを何度も延長しないで

>a 

id cat.a1 cat.a2 cat.a3 cat.b1 cat.b2 cat.b3 cat.c1 cat.c2 cat.c3 
1 1.0  2.0 3.0 1.0  2.0 3.0 1.0  2.0 3.0 
2 1.0  2.0 3.0 1.0  2.0 3.0 1.0  2.0 3.0 
3 1.0  2.0 3.0 1.0  2.0 3.0 1.0  2.0 3.0 

上記のデータフレームは、私が始めているものです。そこから私は、私が

id cat.a cat.b cat.c 
1 1.0 2.0 3.0 
1 1.0 2.0 3.0 
1 1.0 2.0 3.0 
2 1.0 2.0 3.0 
2 1.0 2.0 3.0 
2 1.0 2.0 3.0 
3 1.0 2.0 3.0 
3 1.0 2.0 3.0 
3 1.0 2.0 3.0 

これまでのところ、私がやって試してみました複数のひだを得るために私のコードを変更するにはどうすればよい

id cat.a cat.b1 cat.b2 cat.b3 cat.c1 cat.c2 cat.c3 
1  1.0 1.0  2.0 3.0 1.0  2.0 3.0 
1  2.0 1.0  2.0 3.0 1.0  2.0 3.0 
1  3.0 1.0  2.0 3.0 1.0  2.0 3.0 
2  1.0 1.0  2.0 3.0 1.0  2.0 3.0 
2  2.0 1.0  2.0 3.0 1.0  2.0 3.0 
2  3.0 1.0  2.0 3.0 1.0  2.0 3.0 
3  1.0 1.0  2.0 3.0 1.0  2.0 3.0 
3  2.0 1.0  2.0 3.0 1.0  2.0 3.0 
3  3.0 1.0  2.0 3.0 1.0  2.0 3.0 

を与え、次の

a %>% 
gather(key1,cat.a,starts_with('cat.a')) %>% 
select(-starts_with('key')) %>% 
arrange(id) 

を行うことができました期待していたように、これは私が必要とするよりもはるかに長いデータフレームをもたらしました。

答えて

2

ここtidyverseとの一つの方法があり、

library(tidyverse) 
df %>% 
    gather(var, val, starts_with('cat')) %>% 
    group_by(var = sub('\\d+', '', var)) %>% 
    mutate(new = seq(n())) %>% 
    spread(var, val) %>% 
    select(-new) %>% 
    ungroup() 

## A tibble: 9 × 4 
#  id cat.a cat.b cat.c 
#* <int> <dbl> <dbl> <dbl> 
#1  1  1  1  1 
#2  1  2  2  2 
#3  1  3  3  3 
#4  2  1  1  1 
#5  2  2  2  2 
#6  2  3  3  3 
#7  3  1  1  1 
#8  3  2  2  2 
#9  3  3  3  3 
+0

あなたは何を '\\ D +' をしているのですか?説明してもらえ私はそれが正規表現だと知っていますが、何が起こっているのか分かりません。 – Alex

+1

文字列から数字を削除します。 'sub( '\\ d +'、 ''、 'abc12')' – Sotos

関連する問題