2012-03-06 7 views
2

だから - 私はそうのように、idでインデックス付けを繰り返し観測のこれらのグループを持っているDFで働いている:これらのデータをRでどのように再構成するのですか?

id | x1 | x2 | y1 | y2 
1 a b c 2 
1 a b d 3 
1 a b e 4 
2 ... 
2 ... 
... 

すなわち、各グループ内のすべての変数は、同一であり、Y1とY2のために保存(一般に、y2 'は' y1 'を変更します。)ここで示したこれらの変数はすべて要因です。私は何をしたいのは、次のようなものに、これらのグループのそれぞれを有効にすることです:Y1の(Y1-プライム)はY1とY2の隣接する値の連結をダッシュ​​で、ある

id | x1 | x2 | y1' | y2' | y3' 
1 a b c-2 d-3 e-4 
2 ... 

間にしかし、y1の数はid-groupとid-groupとは異なりますが、これらの追加機能を解決するための非常に広いデータフレームがあればうれしいです。とにかく、私は(むしろ無駄なことに、私は告白する必要があります)、reshape2でこれらのデータを溶かしてキャストしようとしましたが、この時点で、私はこの権利については行っていないのか、それともパッケージが私がここでやろうとしていることに合ってください。すべてのアドバイスをいただければ幸いです - ありがとう!

答えて

1

私が正しく質問を理解していれば、ここplyrでそれを行う方法です:

foo <- read.table(textConnection("id x1 x2 y1 y2 
1 a b c 2 
1 a b d 3 
1 a b e 4"),header=TRUE) 


library("plyr") 

ddply(foo,.(x1,x2),with,{ 
     res <- data.frame(
      id = id[1], 
      x1 = x1[1], 
      x2 = x2[1]) 
     for (i in 1:length(y1)) 
     { 
      res[[paste("y",i,sep="")]] <- paste(y1,y2,sep="-")[i] 
     } 
     return(res) 
     } 
    ) 

これが返されます。

id x1 x2 y1 y2 y3 
1 1 a b c-2 d-3 e-4 
1

を私がサシャの答えを見て、私はそれを拡張してみたいと思いました長いデータセットに変換します。私はこれがあなたに望む結果を与えるとは思えませんが、確信が持てません。あなたがやろうとしていることは私には完全には分かりません。だから、これはあなたが後にしている何をする私の試みですが、私はそれが何であるか全くわからない:

foo <- read.table(textConnection("id x1 x2 y1 y2 
1 a b c 2 
1 a b d 3 
1 a b e 4 
2 a b f 2 
2 a b g 3 
2 a b h 4"),header=TRUE) 


new <- transform(foo, time.var=paste(id, x1, x2, sep=""), 
    y1=paste(y1, y2, sep="-"))[, -5] 

new <- data.frame(unique(foo[, 1:3]), t(unstack(new[, 4:5]))) 
names(new)[4:6] <- paste("y", 1:3, sep="") 
new 

私はあなたがX1とX2(でIDを置けばサシャの答えは私と同じようにうまくいくと思うけど私が)、これは、より一般化することも推測している:

ddply(foo,.(id, x1,x2),with,{ 
     res <- data.frame(
      id = id[1], 
      x1 = x1[1], 
      x2 = x2[1]) 
     for (i in 1:length(y1)) 
     { 
      res[[paste("y",i,sep="")]] <- paste(y1,y2,sep="-")[i] 
     } 
     return(res) 
     } 
    ) 

EDIT:このソリューションは、より一般化することがあります。

new <- transform(foo, y=paste(y1, y2, sep="-"), stringsAsFactors=FALSE) 
aggregate(y~id+x1+x2, new, c) 
0

はい、これはパッケージを再構築するものであるがfでありますまたは。まず、あなたのデータを準備:

foo <- transform(foo, 
       y = paste(y1,y2, sep = "-"), 
       ix = unlist(tapply(id, id, function(gr) 1:length(gr)))) 

は、その後、あなたの転換を進める:それは形を整えています:データが

foo <- read.table(textConnection("id x1 x2 y1 y2 
1 a b c 2 
1 a b d 3 
1 a b e 4 
2 a b f 2 
2 a b g 3"),header=TRUE) 

[編集を設定して

mfoo <- melt(foo, measure.vars = "y") 
cast(mfoo, id + x1 + x2 ~ variable + ix) 

id x1 x2 y_1 y_2 y_3 
1 1 a b c-2 d-3 e-4 
2 2 a b f-2 h-4 <NA> 

を与える必要があります、reshape2であなたはすべきですcastの代わりにdcastを使用してください。

+0

誰でもダウングレードしてください。 – VitoshKa

関連する問題