R - Суммарный список матрицы с разными столбцами - PullRequest
1 голос
/ 21 марта 2019

У меня большой список матриц с разными столбцами, и я хотел бы сложить эти матрицы, считая 0, если столбец X не существует в одной матрице.

Если бы вы использовали функцию rbind.fill из plyr, я бы хотел что-то подобное, но с функцией суммы. Конечно, я мог бы создать функцию для этого, но я думаю о нативной функции, эффективно запрограммированной в Frotrain или C из-за моих больших данных.

Вот пример: Это простой пример, где у меня есть те же столбцы:

aa <- list(
  m1 = matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3, dimnames = list(c(1,2,3),c('a','b','c'))),
  m2 = matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3, dimnames = list(c(1,2,3),c('a','b','c')))
)
aa
Reduce('+',aa)

Давать результаты:

> aa
$m1
  a b c
1 1 4 7
2 2 5 8
3 3 6 9

$m2
  a b c
1 1 4 7
2 2 5 8
3 3 6 9

> Reduce('+',aa)
  a  b  c
1 2  8 14
2 4 10 16
3 6 12 18

И с моими данными:

bb <- list(
  m1 = matrix(c(1,2,3,7,8,9), nrow = 3, dimnames = list(c(1,2,3),c('a','c'))),
  m2 = matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3, dimnames = list(c(1,2,3),c('a','b','c')))
)
bb
Reduce('+',bb)

Здесь я хотел бы иметь b = c (0,0,0) в первой матрице для их суммирования.

> bb
$m1
  a c
1 1 7
2 2 8
3 3 9

$m2
  a b c
1 1 4 7
2 2 5 8
3 3 6 9

Большое спасибо!

Xevi

1 Ответ

1 голос
/ 21 марта 2019

Один из вариантов будет

un1 <- sort(unique(unlist(lapply(bb, colnames))))
bb1 <- lapply(bb, function(x) {
    nm1 <- setdiff(un1, colnames(x))
    m1 <- matrix(0, nrow = nrow(x), ncol = length(nm1), dimnames = list(NULL, nm1))
    cbind(x, m1)[, un1]})

и использовать Reduce

Reduce(`+`, bb1)
#   a b  c
# 1 2 4 14
# 2 4 5 16
# 3 6 6 18
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...