我想将数据制成表格,以便因子变量成为列并保持单元格中另一个变量的值。
所以我试过了,
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
,plyr
,reshape2
但找不到我想要做的事情。所以,我做了旧的循环方式。
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
......大数据需要永远。
有更好的选择吗?
答案 0 :(得分:2)
这是data.table
选项:
library(data.table)
dt = data.table(dt)
dt[, as.list(b), by = a]
答案 1 :(得分: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”等),这些名称可能无法描述你实际上在大多数时间做的事情......
答案 2 :(得分: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