0

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

df<-data.frame(site=c("A", "A", "B", "C", "B"), A=c("item1", "item1", "item2", "item2", "item3"),
               A_weight=c(4.2,4.2,6.1,6.4,8.5), A_numbers=c(1,2,8,5,2))

[x]列の各項目について、 2 つの新しい列が自動的に作成され、 andAという名前が付けられるようにしたいと考えています。これらの各列に、 in columnの各出現に隣接する初期データ フレームのand列の値を割り当てたいと考えています。"item[x]_weight""item[x]_numbers"A_weightA_numbersitem[x]A

最終的なデータ フレームは次のようになります。

df_final<-data.frame(site=c("A", "A", "B", "C", "B"), A=c("item1", "item1", "item2", "item2", "item3"),
                      A_weight=c(4.2,4.2,6.1,6.4,8.5), A_numbers=c(1,2,8,5,2), item1_weight=c(4.2,4.2, NA, NA, NA),
                     item1_numbers=c(1,2, NA, NA, NA), item2_weight=c(NA, NA, 6.1, 6.4, NA),
                     item2_numbers=c(NA, NA, 8, 5, NA), item3_weight=c(NA, NA, NA, NA, 8.5),
                     item3_numbers=c(NA, NA, NA, NA, 2))

reshape パッケージと match 関数を使用していくつかのアプローチを試みましたが、進歩していないように感じます (つまり、まともな結果が得られません...)。元のデータセットに非常に大きな「アイテム」のリストがあることを考えると、これは手動で行う手順ではありません。私はRにまったく慣れておらず、いくつかのガイダンスを使用できるので、どんな支援も大歓迎です。ありがとうございました

4

3 に答える 3

1

reshape2 を使用して行番号の列を追加し、これを長い形式に溶かしてからdcast、元のデータ フレームとマージして行番号を削除するワイド形式に変換するために使用します。最後に名前を修正します。

library(reshape2)

df.row <- cbind(row = 1:nrow(df), df)
m <- melt(df.row, id = 1:3)
wide <- merge(df.row, dcast(m, row ~ A + variable))[-1]
setNames(wide, sub("_A_", "_", names(wide)))

最後の行は次のとおりです。

  site     A A_weight A_numbers item1_weight item1_numbers item2_weight
1    A item1      4.2         1          4.2             1           NA
2    A item1      4.2         2          4.2             2           NA
3    B item2      6.1         8           NA            NA          6.1
4    C item2      6.4         5           NA            NA          6.4
5    B item3      8.5         2           NA            NA           NA
  item2_numbers item3_weight item3_numbers
1            NA           NA            NA
2            NA           NA            NA
3             8           NA            NA
4             5           NA            NA
5            NA          8.5             2
于 2013-05-22T20:06:17.917 に答える
0

ベースリシェイプならできるはず。A_weight 変数と A_number 変数が必要な場合は、それらを手動で追加できます。または、reshape() 呼び出しでそれらを保持するオプションがある可能性があります (ドキュメントをちらっと見ただけではわかりませんでした)。

> df<-data.frame(site=c("A", "A", "B", "C", "B"), A=c("item1", "item1", "item2", "item2", "item3"),
+                A_weight=c(4.2,4.2,6.1,6.4,8.5), A_numbers=c(1,2,8,5,2))
> 
> (df_final <- reshape(df,idvar=c("site","A_numbers","A_weight"),timevar="A",direction="wide",v.names=c("A_numbers","A_weight")))
  site A_numbers.item1 A_weight.item1 A_numbers.item2 A_weight.item2 A_numbers.item3 A_weight.item3
1    A               1            4.2              NA             NA              NA             NA
2    A               2            4.2              NA             NA              NA             NA
3    B              NA             NA               8            6.1              NA             NA
4    C              NA             NA               5            6.4              NA             NA
5    B              NA             NA              NA             NA               2            8.5
于 2013-05-22T19:47:49.063 に答える