5

ワイド フォーマットからロング フォーマットへのパネル データセットの変換に苦労しています。データセットは次のようになります。

ID | KP1_430a | KP1_430b | KP1_430c | KP2_430a | KP2_430b | KP2_430c | KP1_1500a | ...  
1     ....
2     ....

KP1; KP2 から KP7 まではウェーブを表します。a、b から f までは、特定のアイテムを表します。(例: パーティー a の左から右への配置)

このデータを長い形式で保持したいと考えています。このような:

ID | Party | Wave | 430 | 1500  
 1     1       1     ..    ..
 1     2       1     ..    ..
 .     .       .          
 1     1       2     ..    ..
 .     .       .         
 2     1       1     ..    ..  

リシェイプ機能を使ってみました。しかし、私は時間の経過とともにそれを再形成するのに問題を抱えていました.

これは小さな data.frame の例です。

data <- data.frame(matrix(rnorm(10),2,10))  
data[,1] <- 1:2  
names(data) <- c("ID","KP1_430a" , "KP1_430b" , "KP1_430c" , "KP2_430a" , "KP2_430b ", "KP2_430c ", "KP1_1500a" ,"KP1_1500b", "KP1_1500c")

そして、これが私が到達した距離です。

  data_long <- reshape(data,varying=list(names(data)[2:4],names(data)[5:7], names(data[8:10]),  
                            v.names=c("KP1_430","KP2_430","KP1_1500"),  
                           direction="long", timevar="Party")

問題は残ります: 時変変数を長い形式で取得するにはどうすればよいですか? そして、このデータを再形成するよりエレガントな方法はありますか? 上記のコードでは、各波と変数の名前 (names(data)[2:4]) を入力する必要があります。この小さな data.frame で問題ありませんが、データセットはかなり大きくなります。

EDIT:この変換を手動で行う方法:私は実際にこれを行ったので、ページ長のコードファイルが残ります。
まず、KP1_430a と KP1_1500a を ID、Time=1、Party=1 の列ごとにバインドします。次に、すべてのパーティ [bf] に対して同じオブジェクトを作成し、パーティ インデックスをそれぞれ変更して、行ごとに追加します。残りのウェーブ [2-7] に対してステップ 1 と 2 を実行し、それぞれパーティと時間変数を変更して、行ごとに追加します。

4

2 に答える 2

4

通常は 2 つのステップで進める方が簡単です。最初に を使用meltしてデータを「tall」形式に変換し (既にそうでない場合)、次に を使用dcastして ti をより広い形式に変換します。

library(reshape2)
library(stringr)

# Tall format
d <- melt(data, id.vars="ID")

# Process the column containing wave and party
d1 <- str_match_all( 
  as.character( d$variable ), 
  "KP([0-9])_([0-9]+)([a-z])" 
)
d1 <- do.call( rbind, d1 )
d1 <- d1[,-1]
colnames(d1) <- c("wave", "number", "party")
d1 <- as.data.frame( d1)
d <- cbind( d, d1 )

# Convert to the desired format
d <- dcast( d, ID + wave + party ~ number )
于 2012-01-25T14:56:47.097 に答える
0

現時点では、Wave データは変数名に含まれており、文字列処理で抽出する必要があります。溶けても問題なかった

mdat <- melt(data, id.vars="ID")
mdat$wave=sub("KP", "", sub("_.+$", "", mdat$variable)) # remove the other stuff
mdat

あなたの説明は(これまでのところ)大雑把すぎて、「Party」変数を導出するためのルールを理解できません。そのため、質問を編集して、それが人間によってどのように行われるかを示すことができます....そして、私たちはできるその方法をコンピュータに示します。

編集: Vincent が考えているように、元の列名の最後の小文字が Party である場合、それらの名前の末尾のスペースをトリミングして抽出できます。

mdat$var <- sub("\\s", "", (as.character(mdat$variable)))
mdat$party=substr( mdat$var, nchar(mdat$var), nchar(mdat$var))
#--------------
> mdat
   ID  variable      value wave party       var
1   1  KP1_430a  0.7220627    1     a  KP1_430a
2   2  KP1_430a  0.9585243    1     a  KP1_430a
3   1  KP1_430b -1.2954671    1     b  KP1_430b
4   2  KP1_430b  0.3393617    1     b  KP1_430b
5   1  KP1_430c -1.1477627    1     c  KP1_430c
6   2  KP1_430c -1.0909179    1     c  KP1_430c
<snipped output>
于 2012-01-25T14:55:50.137 に答える