2012-01-25 8 views
5

パネルデータセットをワイドからロングの形式に変換するのに苦労しています。データセットは次のようになります。パネルのデータ型を長形に変更する

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

KP1; KP2からKP7までがWavesを記述しています。 a、b〜fは特定のItemを表します。 (例えば、当事者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") 

問題が残っています。どのようにして、長い形式の可変変数も得ることができますか?そして、このデータを再構成するよりエレガントな方法がありますか?上記のコードでは、各ウェーブと変数の名前(名前(データ)[2:4])を入力する必要があります。この小さなdata.frameではOkですが、Datasetはもっと大きくなります。

EDIT:どのようにこの変換を手で行うことができますか:私は実際にこれを実行しました。ページ長のコードファイルが残っています。
まず、IDがTime = 1、Party = 1の場合はKP1_430aとKP1_1500aをバインドします。第2に、すべてのパーティー[b-f]に対して同じオブジェクトを作成し、パーティーインデックスをそれぞれ変更し、それを行ごとに追加します。残りの波[2-7]に対してそれぞれ1と2のステップを実行して、パーティーと時間varをそれぞれ変更し、それらを行ごとに追加します。

+0

長い形式で別の列を430と1500にする場合は、それらの条件のデータと同じ量のデータをワイドにする必要があります。あなたが持っている方法では、あなたは1500カラムに多くのNAを持っていますか...それともそうしたいのですか? – John

+0

ああ、これはおそらくすべてのスケッチです。これらの2つの変数には波数(1-7)とパーティアイテム(a-f)が同量です。従って:KP [1-7] _430 [a-f]、KP [1-7] _1500 [a-f]。 – lstoetze

+0

しかし、データセット内のいくつかの変数には、(a)いくつかの波のデータのみがあります。パーティー固有ではないKP [146] _1640 [a-f]または(b)。 KP [1-7] _1490。 – lstoetze

答えて

4

通常、続行する方が簡単です最初にmeltを使用してデータを "背の高い"形式にしてから(すでにそうでない場合)、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) 
+0

それは動作します!すばらしいです。ありがとうございました。 – lstoetze

0

あなたのWaveデータはあなたの変数名にあり、いくつかの文字列処理でそれを抽出する必要があります。私はあなたの説明は(今のところ)私は「党」の変数を導出するためのルールを把握するために、ので、おそらくあなたはそれがあるかもしれない方法を示すために質問を編集することができますあまりにも不完全である

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

融液と支障がありませんでした人間によって行われた...そして、我々はそれを行う方法をコンピュータに示すことができる。

EDIT:元の列名の最後の小文字は、ヴィンセントが考えるように、あなたはそれらの名前と抽出液中の末尾のスペースをトリムできパーティーの場合:

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> 
関連する問題