9

データをロングフォーマットからワイドフォーマットに変換したい。reshape列ラベルを変更することが本当に煩わしいと感じた場合、それを回避する方法はありますか?

たとえば、次のような長い形式のデータがある場合:

Year Name Value
1996 a    1
1997 a    2
1998 b    3
1999 b    4

私はreshape()このように使用します

reshape(long, timevar = "Year", idvar = "Name", direction = "wide")

変換自体は正常に機能しますが、列名は次のようになります。

Name Time.1996 Time.1997 Time.1998 Time.1999 

私が今考えることができる唯一のことは、列名を手動で名前変更することです。これは、複数のデータセットに対して変更する必要がある場合は非常に面倒です。

4

1 に答える 1

19

ここに質問はありませんが、それがそれほど気になる場合は、いくつかの選択肢があります。

xtabsベースRでは、このタイプの変換に(多くの場合)使用できます。

as.data.frame.matrix(xtabs(Value ~ Name + Year, long))
#   1996 1997 1998 1999
# a    1    2    0    0
# b    0    0    3    4

または、パッケージを使用dcastして、「reshape2」から使用できます。

library(reshape2)
dcast(long, Name ~ Year)
# Using Value as value column: use value.var to override.
#   Name 1996 1997 1998 1999
# 1    a    1    2   NA   NA
# 2    b   NA   NA    3    4

私は、単一の変数がこのように再形成されると、名前をそのまま変更するのが面倒になる可能性があることに同意します。ただし、このreshape関数の他の一般的な使用例を覚えておくと、非常に役立つことがわかります。たとえば、「長い」データセットに別の列を追加してから、次のように再形成しましょう。

> long$Something <- 5:8
> reshape(long, timevar = "Year", idvar = "Name", direction = "wide")
  Name Value.1996 Something.1996 Value.1997 Something.1997 Value.1998
1    a          1              5          2              6         NA
3    b         NA             NA         NA             NA          3
  Something.1998 Value.1999 Something.1999
1             NA         NA             NA
3              7          4              8

形を変えている柱の名前を保持しないと、1996年が「価値」のためのものであり、どれが「何か」のためのものであるかがわかりません。


最後reshapeに、 (私がたまたま気に入っている)使用したい場合で、実際のデータがこの例(1つ以上の列によって「ピボット」される必要がある1つの列のみ)に正確に反映されている場合は、さらに2つのオプションがあります。

を使用しsetNamesます。名前がどうあるべきかを予測するのは簡単です。ID変数のベクトルとそれに続く時間変数です。

> setNames(reshape(long, timevar = "Year", idvar = "Name", direction = "wide"), 
+          c("Name", long$Year))
  Name 1996 1997 1998 1999
1    a    1    2   NA   NA
3    b   NA   NA    3    4

subまたはを使用gsubして変数名を編集します。 繰り返しになりますが、ピボットされた変数が1つしかないことがわかっているため、必要な変更を簡単に予測できます。

> wide <- reshape(long, timevar = "Year", idvar = "Name", direction = "wide")
> names(wide)
[1] "Name"       "Value.1996" "Value.1997" "Value.1998" "Value.1999"
> names(wide) <- gsub("Value.", "", names(wide))
> wide
  Name 1996 1997 1998 1999
1    a    1    2   NA   NA
3    b   NA   NA    3    4
于 2013-03-24T18:58:35.453 に答える