2016-09-07 5 views
1

単一変数の番号付きバージョンを生成することにより、長いデータフレームをワイドフォーマットに変換した後にreshapeを元に戻したいと思います。私が直面している課題は、複数のキー変数と複数の変数が再結合する必要がある場合にこれを実行することです。私はtidyrからgatherを使用してみました。長いデータのこの例を見てみましょう:以下data.frame与え作成された任意の数の列を使用した変形を取り消します

toy = data.frame(
    first_key = rep(c("A", "B", "C"), each = 6), 
    second_key = rep(rep(c(1:2), each = 3), 3), 
    colors = c("red", "yellow", "green", "blue", "purple", "beige"), 
    days = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"), 
    index = c(1:3) 
) 

:変数の番号のバージョンとワイドフォーマットに再成形

first_key second_key colors  days index 
     A   1 red Monday  1 
     A   1 yellow Tuesday  2 
     A   1 green Wednesday  3 
     A   2 blue Thursday  1 
     A   2 purple Friday  2 
     A   2 beige Saturday  3 
     B   1 red Monday  1 
     B   1 yellow Tuesday  2 
     B   1 green Wednesday  3 
     B   2 blue Thursday  1 
     B   2 purple Friday  2 
     B   2 beige Saturday  3 
     C   1 red Monday  1 
     C   1 yellow Tuesday  2 
     C   1 green Wednesday  3 
     C   2 blue Thursday  1 
     C   2 purple Friday  2 
     C   2 beige Saturday  3 

は次のようになります。

toy_wide = reshape(toy, idvar = c("first_key", "second_key"), 
      timevar = "index", direction = "wide", sep = "_") 

そして、この広いフォーマットを提供します:

first_key second_key colors_1 days_1 colors_2 days_2 colors_3 days_3 
     A   1  red Monday yellow Tuesday green Wednesday 
     A   2  blue Thursday purple Friday beige Saturday 
     B   1  red Monday yellow Tuesday green Wednesday 
     B   2  blue Thursday purple Friday beige Saturday 
     C   1  red Monday yellow Tuesday green Wednesday 
     C   2  blue Thursday purple Friday beige Saturday 

しかし元の形式に戻すにはどうしたらいいですか?私は以下を試しましたが、エラーが発生します。

tidyr::gather(toy_wide, key = c("first_key", "second_key"), value = c("days", "colors"), 
     colors_1:days_3, factor_key = TRUE) 

Error: Invalid column specification

答えて

1

ここでは、複数のmeasurepatternsを取ることができdata.tableからmeltを持つ別のオプションがあります。

library(data.table) 
melt(setDT(toy_wide), measure = patterns("^colors", "^days"), 
    value.name = c("colors", "days"), variable.name = "index")[order(first_key, second_key)] 
+1

偉大な一般化可能性! – Nancy

4

あなたは広い行くためにreshapeを使用する場合は、長い再び行くことreshapeを使用します。

reshape(toy_wide, idvar = c("first_key", "second_key"), timevar="index", 
     varying=3:8, direction="long", sep="_") 

#  first_key second_key index colors  days 
#A.1.1   A   1  1 red Monday 
#A.2.1   A   2  1 blue Thursday 
# ... 

あなたは、列のリスト3:8値ことができvarying=変数(のセットを指定した場合、列の値が-(1:2)、または列の名前が文字ベクタc("a","b"))、およびsep=の場合は、reshapeは出力変数名を推測することができます穏やかに

それは多くの場合、明確なそれを維持するために、より良いものを自動化するために複数のステップで整形のこれらの種類を行うには便利です:

ids <- c("first_key", "second_key") 
reshape(toy_wide, idvar=ids, timevar="index", 
     varying=setdiff(names(toy_wide), ids), direction="long", sep="_") 
関連する問題