如何将3列数据转换为R中的共存矩阵?
我有3列数据:如何将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语言,但您
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