2

次の 2 つのデータフレームがあります。

>df1<-data.frame(ID=c(111,222,333,444))
   ID
1 111
2 222
3 333
4 444

>df2<-data.frame(ID=c(111,111,111,222,333,333,444,444,444,444,444,444),CODE=c(1,1,2,3,2,3,4,5,2,3,4,5))
    ID CODE
1  111    1
2  111    1
3  111    2
4  222    3
5  333    2
6  333    3
7  444    4
8  444    5
9  444    2
10 444    3
11 444    4
12 444    5

df1 の ID 要素を df2 の ID 要素と照合して、次のような 3 番目のデータフレームを生成します。

> df3<-data.frame(ID=c(111,222,333,444),CODE1=c(1,3,2,4),CODE2=c(1,NA,3,5),CODE3=c(2,NA,NA,2),CODE4=c(NA,NA,NA,3),CODE5=c(NA,NA,NA,4),CODE6=c(NA,NA,NA,5))
   ID CODE1 CODE2 CODE3 CODE4 CODE5 CODE6
1 111     1     1     2    NA    NA    NA
2 222     3    NA    NA    NA    NA    NA
3 333     2     3    NA    NA    NA    NA
4 444     4     5     2     3     4     5

df2 には、df1 のいくつかの ID 要素の複数のコードが含まれていることに注意してください。ID要素に関連付けられた各コードの列を含めることで、df3にこれを反映させたいと思います。

あらゆる提案をお寄せいただきありがとうございます。

4

2 に答える 2

3

これは本質的に「長いものから広いものへ」の形状変更の問題ですが、「時間」変数はありません。aveplusを使用seq_alongして、次のように作成できます。

df2$TIME <- ave(df2$ID, df2$ID, FUN = seq_along)
df2
#     ID CODE TIME
# 1  111    1    1
# 2  111    1    2
# 3  111    2    3
# 4  222    3    1
# 5  333    2    1
# 6  333    3    2
# 7  444    4    1
# 8  444    5    2
# 9  444    2    3
# 10 444    3    4
# 11 444    4    5
# 12 444    5    6

これで、どちらのベース R も簡単に使用できますreshape....

reshape(df2, direction = "wide", idvar = "ID", timevar = "TIME")
#    ID CODE.1 CODE.2 CODE.3 CODE.4 CODE.5 CODE.6
# 1 111      1      1      2     NA     NA     NA
# 4 222      3     NA     NA     NA     NA     NA
# 5 333      2      3     NA     NA     NA     NA
# 7 444      4      5      2      3      4      5

...またはdcast「reshape2」から

library(reshape2)
dcast(df2, ID ~ TIME, value.var="CODE")
#    ID 1  2  3  4  5  6
# 1 111 1  1  2 NA NA NA
# 2 222 3 NA NA NA NA NA
# 3 333 2  3 NA NA NA NA
# 4 444 4  5  2  3  4  5
于 2013-07-18T16:52:52.393 に答える
2

パッケージddplyの関数を使用してタスクを実行できます。plyr

> ddply(df2, .(ID), function (d) { t(d$CODE) })
     ID 1  2  3  4  5  6
  1 111 1  1  2 NA NA NA
  2 222 3 NA NA NA NA NA
  3 333 2  3 NA NA NA NA
  4 444 4  5  2  3  4  5

を使用byして行を取得し、いくつかの巧妙なトリックを使用してすべての行を同じ長さにしてから で結合することrbindができますが、このパッケージを使用する方が簡単です。

于 2013-07-18T15:53:38.313 に答える