我有如下索引和值列表
1 3 2.1
2 1 1.1
2 2 0.2
2 3 0.4
1 2 0.3
1 1 3.2
3 3 4.0
3 1 0.2
3 2 0.1
其中前两列代表我希望使用相应值填充的矩阵的第(i,j)个索引。也就是说,我希望以上代码生成以下矩阵
3.2 0.3 2.1
1.1 0.2 0.4
0.2 0.1 4.0
在R中有没有一种方法可以不使用for循环?
答案 0 :(得分:1)
一种选择是创建一个{0}的matrix
,并用前两列的索引填充数据集第三列的值
m1 <- matrix(0, 3, 3)
m1[as.matrix(df1[1:2])] <- df1[,3]
m1
# [,1] [,2] [,3]
#[1,] 3.2 0.3 2.1
#[2,] 1.1 0.2 0.4
#[3,] 0.2 0.1 4.0
或与sparseMatrix
library(Matrix)
sparseMatrix(i = df1$col1, j = df1$col2, x = df1$col3)
# 3 x 3 sparse Matrix of class "dgCMatrix"
#[1,] 3.2 0.3 2.1
#[2,] 1.1 0.2 0.4
#[3,] 0.2 0.1 4.0
另一个选项是xtabs
xtabs(col3 ~ col1 + col2, df1)
# col2
#col1 1 2 3
# 1 3.2 0.3 2.1
# 2 1.1 0.2 0.4
# 3 0.2 0.1 4.0
如果我们需要有效的选择,可以使用dcast
library(data.table)
dcast(setDT(df1), col1 ~ col2, value.var = 'col3')
或使用tidyverse
library(tidyverse)
df1 %>%
spread(col2, col3)
注意:即使索引数不相等,所有方法也都可以使用
df1 <- structure(list(col1 = c(1L, 2L, 2L, 2L, 1L, 1L, 3L, 3L, 3L),
col2 = c(3L, 1L, 2L, 3L, 2L, 1L, 3L, 1L, 2L), col3 = c(2.1,
1.1, 0.2, 0.4, 0.3, 3.2, 4, 0.2, 0.1)),
class = "data.frame", row.names = c(NA,
-9L))
答案 1 :(得分:1)
您可以按正确的顺序排列矩阵并应用matrix
。
matrix(m[order(m[,2], m[,1]), 3], 3)
# [,1] [,2] [,3]
# [1,] 3.2 0.3 2.1
# [2,] 1.1 0.2 0.4
# [3,] 0.2 0.1 4.0
数据
m <- structure(c(1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 1, 2, 3, 2, 1, 3, 1,
2, 2.1, 1.1, 0.2, 0.4, 0.3, 3.2, 4, 0.2, 0.1), .Dim = c(9L, 3L
))