5

次のデータ フレームがあるとします。

d <- data.frame(id=c(1,1,1,2,2,3,3,3), time=c(1,2,3,1,2,1,2,3), var=runif(8))

 d
  id time       var
1  1    1 0.3733586
2  1    2 0.5743769
3  1    3 0.8253280
4  2    1 0.8136957
5  2    2 0.8726963
6  3    1 0.1105549
7  3    2 0.9527002
8  3    3 0.5690021

base関数を使用すると、 a (同じユニットに属する行を識別する) と a (同じユニットの異なる観測を識別する)reshapeを指定することで、「ワイド」形式に変換できます。ìdvartimevar

reshape(d, idvar="id", timevar="time", direction="wide")

  id     var.1     var.2     var.3
1  1 0.3733586 0.5743769 0.8253280
4  2 0.8136957 0.8726963        NA
6  3 0.1105549 0.9527002 0.5690021

dcastの関数でそれをやろうとしましたreshape2が、方法が見つかりませんでした。それが可能かどうか知っていますか?

EDIT : Ananda Mahto のコメントと回答は完全に正しいです。実際の問題は、複数のvar列がある場合に元のデータ フレームをキャストすることでした。私の例は適切ではありませんでした、申し訳ありません。

4

1 に答える 1

9

以下は動作しませんか?

dcast(d, id ~ time)
# Using var as value column: use value.var to override.
#   id         1          2         3
# 1  1 0.2869739 0.59591690 0.8989719
# 2  2 0.4533770 0.14741778        NA
# 3  3 0.1286770 0.02465634 0.7363114

## OR, to get rid of the message:
## dcast(d, id ~ time, value.var = "var")

ただし、少し異なる質問をしていると思います(私のコメントで述べたように)。特に、次のものから始めたとしたらどうでしょう。

set.seed(1)
d <- data.frame(id = c(1,1,1,2,2,3,3,3), 
                time = c(1,2,3,1,2,1,2,3), 
                var1 = runif(8),
                var2 = runif(8))

ベース Rreshapeを使用すると、次の 1 行だけになります。

reshape(d, direction = "wide", idvar = "id", timevar = "time")
#   id    var1.1    var2.1    var1.2     var2.2    var1.3    var2.3
# 1  1 0.2655087 0.6291140 0.3721239 0.06178627 0.5728534 0.2059746
# 4  2 0.9082078 0.1765568 0.2016819 0.68702285        NA        NA
# 6  3 0.8983897 0.3841037 0.9446753 0.76984142 0.6607978 0.4976992

dcast「reshape2」から同じことをやってみましょう。私たちが取りたくなるかもしれないアプローチは次のとおりです。

library(reshape2)
dcast(d, id ~ time)
# Using var2 as value column: use value.var to override.
#   id         1          2         3
# 1  1 0.6291140 0.06178627 0.2059746
# 2  2 0.1765568 0.68702285        NA
# 3  3 0.3841037 0.76984142 0.4976992

しかしdcast、単一のvalue.var. meltそのため、データを再度取得する必要があります。

d2 <- melt(d, id.vars = c("id", "time"))
head(d2)
#   id time variable     value
# 1  1    1     var1 0.2655087
# 2  1    2     var1 0.3721239
# 3  1    3     var1 0.5728534
# 4  2    1     var1 0.9082078
# 5  2    2     var1 0.2016819
# 6  3    1     var1 0.8983897

dcastこれで、非常に簡単に使用できます。

dcast(d2, id ~ variable + time)
#   id    var1_1    var1_2    var1_3    var2_1     var2_2    var2_3
# 1  1 0.2655087 0.3721239 0.5728534 0.6291140 0.06178627 0.2059746
# 2  2 0.9082078 0.2016819        NA 0.1765568 0.68702285        NA
# 3  3 0.8983897 0.9446753 0.6607978 0.3841037 0.76984142 0.4976992
于 2013-02-07T11:26:26.330 に答える