0

因子変数が列になり、セル内の別の変数からの値を保持するようにデータを集計したかったのです。

だから私は試しました、

a=rep(1:3,3)
d<-rep(1:3, each=3)
b=rnorm(9)
c=runif(9)
dt<-data.frame(a,d,b,c)

  a d          b         c
1 1 1  0.3819762 0.5199602
2 2 1  0.3896063 0.9144730
3 3 1  2.4356972 0.2888464
4 1 2  1.2697016 0.9831191
5 2 2 -1.9844689 0.2046947
6 3 2  0.3473766 0.4766178
7 1 3 -1.5461235 0.6187189
8 2 3  1.0829027 0.9089551
9 3 3 -0.1305324 0.6326141

を探しましたが、data.tableやりたいことが見つかりませんでした。だから、私は古いループの方法をやった。plyrreshape2

mat<-matrix(NA, nrow=3, ncol=4)


for (i in 1:3){
  mat[i,1]<-i
  for (j in 1:3){
    val=dt[a==i & d==j,3]
    mat[i,j+1]<-val

  }

}



mat
     [,1]      [,2]       [,3]       [,4]
[1,]    1 0.3819762  1.2697016 -1.5461235
[2,]    2 0.3896063 -1.9844689  1.0829027
[3,]    3 2.4356972  0.3473766 -0.1305324

...そして、ビッグデータには永遠に時間がかかります。

より良いオプションはありますか??

4

3 に答える 3

2

ここにdata.tableオプションがあります:

library(data.table)
dt = data.table(dt)

dt[, as.list(b), by = a]
于 2013-05-29T16:35:28.533 に答える
1

reshape2 の使用

> library(reshape2)
> dcast(dt, a ~ d, value.var = "b")
  a         1          2          3
1 1 0.3819762  1.2697016 -1.5461235
2 2 0.3896063 -1.9844689  1.0829027
3 3 2.4356972  0.3473766 -0.1305324
于 2013-05-29T16:56:09.817 に答える
1

これは、ベース R でも実行できます。

reshape(dt,timevar="d",idvar="a",drop="c",direction="wide")

あなたのデータについては、これは...

  a       b.1        b.2        b.3
1 1 0.3819762  1.2697016 -1.5461235
2 2 0.3896063 -1.9844689  1.0829027
3 3 2.4356972  0.3473766 -0.1305324

set.seed再現しやすいように、シミュレーションデータを描画する前に使用してください。

このソリューションが高速になるかどうかはわかりません。また、将来それを使用するには、これらの紛らわしい引数名 (「timevar」、「idvar」など) に慣れる必要があります。これらは、ほとんどの場合、実際に行っていることを説明していない可能性があります...

于 2013-05-29T16:51:38.307 に答える