如何使用两个索引将矢量转换为矩阵?

时间:2015-02-25 18:29:55

标签: r

我的数据集如下所示:

a<-c(1,1,1,2,2,2,3,3,3)
b<-rep(1:3,3)
c<-c(rep(c("i","j","k","l"),2),"o")
d<-data.frame(a,b,c)

给出:

  a b c
1 1 1 i
2 1 2 j
3 1 3 k
4 2 1 l
5 2 2 i
6 2 3 j
7 3 1 k
8 3 2 l
9 3 3 o

我正在寻找一种方法将c转换为以下形式:

  1 2 3
1 i j k
2 l i j
3 k l o

所以基本上我希望使用a作为行索引,b作为列索引,然后将列c转换为矩阵。有没有什么办法可以通过使用data.table或其他包来有效地完成?

非常感谢你们!

2 个答案:

答案 0 :(得分:1)

@ doscendo的解决方案很干净;您只需确保数据框正确排序。这是一个稍微更通用的版本,它使用矩阵索引来创建您所追求的内容,并且如果数据框未指定每个值,或者如果指定的值多于一次(最后一个值占优势),则将同时工作,或者如果数据没有排序(当然最后一个你总是可以排序):

mx <- with(d, matrix(ncol=max(a), nrow=max(b)))
mx[as.matrix(d[1:2])] <- as.character(d$c)

     [,1] [,2] [,3]
[1,] "i"  "j"  "k" 
[2,] "l"  "i"  "j" 
[3,] "k"  "l"  "o" 

答案 1 :(得分:0)

正如docendo所说,你可以只使用c进行行主要布局

matrix(c, 3, byrow=T)

或者,如果你迫切希望使用a和b矢量,我建议下一个技巧

mymatrix = matrix(rep(0, 9), 3)  # creating init matrix of required size
for(i in seq_along(a)){mymatrix[a[i],b[i]]=c[i]} # fill out the matrix