Преобразовать список индексов и значений в матрицу - PullRequest
1 голос
/ 21 июня 2019

У меня есть список индексов и значений следующим образом

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?

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Вы можете привести матрицу в правильном порядке и применить 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
))
1 голос
/ 21 июня 2019

Можно создать matrix из 0 и заполнить значения третьего столбца набора данных индексами из первых двух столбцов

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...