ここに質問はありませんが、それがそれほど気になる場合は、いくつかの選択肢があります。
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