如何将3列数据转换为R中的共存矩阵?

如何将3列数据转换为R中的共存矩阵?,r,matrix,coexistence,R,Matrix,Coexistence,我有3列数据: var1 var2 Z 1 2 1.2 3 4 5.4 1 4 2.3 我想把它转换成一个共存矩阵,如下所示: 1 2 3 4 1 0 1.2 0 2.3 2 0 0 0 0 3 0 0 0 5.4 4 0 0 0 0 用R语言有什么方法可以做到这一点吗? 提前感谢您的时间。事实上,我不熟悉R语言,但您

我有3列数据:

var1 var2    Z
   1   2    1.2
   3   4    5.4
   1   4    2.3
我想把它转换成一个共存矩阵,如下所示:

       1   2    3    4
  1    0   1.2  0   2.3
  2    0   0    0   0
  3    0   0    0   5.4
  4    0   0    0   0
用R语言有什么方法可以做到这一点吗?
提前感谢您的时间。

事实上,我不熟悉R语言,但您可以使用我在java中完成的这种逻辑

int[] row1 = {1, 3, 1}; 
int[] row2 = {2, 4, 4};
double[] z = {1.2, 5.4, 2.3};

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                for (int k = 0; k < row1.length; k++) {
                    if (row1[k] == i && row2[k] == j) {
                        System.out.println(z[k]);
                    }
                }
            }
            System.out.println("\n");
        }

我假设您从data.frame开始,可能是这样的:

mydf <- structure(list(var1 = c(1L, 3L, 1L), var2 = c(2L, 4L, 4L), Z = c(1.2, 
    5.4, 2.3)), .Names = c("var1", "var2", "Z"), row.names = c(NA, 
    3L), class = "data.frame")

像xtabsZ~factorvar1,1:4+factorvar2,1:4,如果你的数据是一个数据。帧?@A5C1D2H2I1M1N2O1R2T1-使用原力,我的意思是,使用矩阵索引。@thela,这是我的第一个想法,但后来我想也许他们可以使用一个内置函数。。。
D <- max(unlist(mydf[1:2]))
M <- matrix(0, ncol = D, nrow = D)
M[as.matrix(mydf[1:2])] <- mydf[[3]]
M
#      [,1] [,2] [,3] [,4]
# [1,]    0  1.2    0  2.3
# [2,]    0  0.0    0  0.0
# [3,]    0  0.0    0  5.4
# [4,]    0  0.0    0  0.0
D <- max(unlist(mydf[1:2]))
mydf[1:2] <- lapply(mydf[1:2], factor, seq_len(D))
str(mydf)
# 'data.frame': 3 obs. of  3 variables:
#  $ var1: Factor w/ 4 levels "1","2","3","4": 1 3 1
#  $ var2: Factor w/ 4 levels "1","2","3","4": 2 4 4
#  $ Z   : num  1.2 5.4 2.3

xtabs(Z ~ var1 + var2, mydf)
#     var2
# var1   1   2   3   4
#    1 0.0 1.2 0.0 2.3
#    2 0.0 0.0 0.0 0.0
#    3 0.0 0.0 0.0 5.4
#    4 0.0 0.0 0.0 0.0

library(tidyr)
mydf %>% spread(var2, Z, fill = 0, drop = FALSE)
#   var1 1   2 3   4
# 1    1 0 1.2 0 2.3
# 2    2 0 0.0 0 0.0
# 3    3 0 0.0 0 5.4
# 4    4 0 0.0 0 0.0

library(data.table)
dcast(as.data.table(mydf), var1 ~ var2, value.var = "Z", fill = 0, drop = FALSE)
#    var1 1   2 3   4
# 1:    1 0 1.2 0 2.3
# 2:    2 0 0.0 0 0.0
# 3:    3 0 0.0 0 5.4
# 4:    4 0 0.0 0 0.0