15

このようなデータがあります

df = data.frame(name=c("A","A","B","B"),
                group=c("g1","g2","g1","g2"),
                V1=c(10,40,20,30),
                V2=c(6,3,1,7))

私はそれを次のように再形成したい:

df = data.frame(name=c("A", "B"),               
                V1.g1=c(10,20),
                V1.g2=c(40,30),
                V2.g1=c(6,1),
                V2.g2=c(3,7))

tidyRでそれを行うことは可能ですか?

リシェイプでできる

reshape(df, idvar='name', timevar='group', direction='wide')

しかし、何か新しいことを学ぶのはいつでも良いことです。

4

4 に答える 4

15

複数のreshape値列に対して機能するため、コードはコンパクトです。で同じものを使用するにはtidyr、いくつかの手順が必要になる場合があります。gather単一の 'Val' 列、'Var' (前のステップから) および 'group' 列が存在するように、'wide' 形式を 'long' に変換しuniteて単一の 'VarG' 列を作成し、次に使用spreadします「ロング」フォーマットを「ワイド」フォーマットに再変換します。

library(tidyr)
gather(df, Var, Val, V1:V2) %>% 
                unite(VarG, Var, group) %>% 
                spread(VarG, Val)
#    name V1_g1 V1_g2 V2_g1 V2_g2
#1    A    10    40     6     3
#2    B    20    30     1     7
于 2015-03-19T13:49:32.690 に答える
10

dcastdata.table v1.9.5+ では、複数のvalue.var列を処理できます。したがって、次のことができます。

library(data.table) # v1.9.5+
dcast(setDT(df), name ~ group, value.var=c("V1", "V2"))
#    name V1_g1 V1_g2 V2_g1 V2_g2
# 1:    A    10    40     6     3
# 2:    B    20    30     1     7

基本的に、溶かしてキャストする必要はなく、直接キャストします。次の手順に従ってインストールできます。

于 2015-03-19T14:32:17.043 に答える