Внешний Союз в R - PullRequest
       5

Внешний Союз в R

0 голосов
/ 11 февраля 2020

Мне нужно выполнить объединение двух таблиц в R. Однако объединение должно включать столбцы, которые не являются общими для двух родительских матриц / таблиц.

Этот сценарий выглядит очень похоже на Внешний Союз описан здесь: https://cs.stackexchange.com/questions/6997/what-is-outer-union-and-why-is-it-partially-compatible

У меня есть две матрицы:

Матрица 1

Name Var1 Var2 
1    1    0 
2    1    0 

Матрица 2

Name Var1 Var3
3    0    1
4    0    1

Что мне нужно объединить в Матрицу 3:

Name Var1 Var2 Var3
1    1    0    0
2    1    0    0
3    0    0    1
4    0    0    1

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Базовое решение R с использованием merge

M <- replace(M<-as.matrix(merge(data.frame(M1),data.frame(M2),all = T)),
        which(is.na(M)),
        0)

, такое что

> M
     Name Var1 Var2 Var3
[1,]    1    1    0    0
[2,]    2    1    0    0
[3,]    3    0    0    1
[4,]    4    0    0    1

DATA

M1 <- structure(c(1L, 2L, 1L, 1L, 0L, 0L), .Dim = 2:3, .Dimnames = list(
    NULL, c("Name", "Var1", "Var2")))

M2 <- structure(c(3L, 4L, 0L, 0L, 1L, 1L), .Dim = 2:3, .Dimnames = list(
    NULL, c("Name", "Var1", "Var3")))
1 голос
/ 11 февраля 2020

Мы можем преобразовать в data.frame и использовать bind_rows. По умолчанию он заполняет пропущенные значения с помощью NA

library(dplyr)
library(tidyr)
bind_rows(as.data.frame(m1), as.data.frame(m2)) %>%
    mutate_all(replace_na, 0) %>%
    as.matrix
#      Name Var1 Var2 Var3
#[1,]    1    1    0    0
#[2,]    2    1    0    0
#[3,]    3    0    0    1
#[4,]    4    0    0    1

, или как @markus упомянул rbind.fill.matrix из plyr было бы полезно

plyr::rbind.fill.matrix(m1, m2)

data

m1 <- structure(c(1L, 2L, 1L, 1L, 0L, 0L), .Dim = 2:3, .Dimnames = list(
    NULL, c("Name", "Var1", "Var2")))

m2 <- structure(c(3L, 4L, 0L, 0L, 1L, 1L), .Dim = 2:3, .Dimnames = list(
    NULL, c("Name", "Var1", "Var3")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...