Добавить вместе 2 кадра данных в R без потери столбцов - PullRequest
0 голосов
/ 17 января 2019

У меня есть 2 кадра данных в R (df1, df2).

A C D
1 1 1
2 2 2

df2 как

A B C
1 1 1
2 2 2

Как можно объединить эти два кадра данных для получения следующего вывода?

A B C D
2 1 2 1
4 2 4 2

Столбцы отсортированы, а значения столбцов добавлены. Оба DF имеют одинаковое количество строк. Заранее спасибо. Код для создания DF:

df1 <- data.frame("A" = 1:2, "C" = 1:2, "D" = 1:2)
df2 <- data.frame("A" = 1:2, "B" = 1:2, "C" = 1:2)

Ответы [ 5 ]

0 голосов
/ 17 января 2019

Вот забавный базовый метод R с Reduce.

Reduce(cbind,
       list(Reduce("+", list(df1[intersect(names(df1), names(df2))],
                             df2[intersect(names(df1), names(df2))])), # sum results
                             df1[setdiff(names(df1), names(df2))], # in df1, not df2
                             df2[setdiff(names(df2), names(df1))])) # in df2, not df1

Это возвращает

  A C D B
1 2 2 1 1
2 4 4 2 2

Предполагается, что в df1 и df2 есть столбцы, которых нет в другом. Если это не так, вам придется настроить список.

Обратите внимание, что вы можете заменить Reduce на do.call в обоих местах, и вы получите тот же результат.

0 голосов
/ 17 января 2019
allnames <- sort(unique(c(names(df1), names(df2))))

df3 <- data.frame(matrix(0, nrow = nrow(df1), ncol = length(allnames)))
names(df3) <- allnames

df3[,allnames %in% names(df1)] <- df3[,allnames %in% names(df1)] + df1
df3[,allnames %in% names(df2)] <- df3[,allnames %in% names(df2)] + df2

df3
  A B C D
1 2 1 2 1
2 4 2 4 2
0 голосов
/ 17 января 2019

Вы можете попробовать:

library(tidyverse)

list(df2, df1) %>%
  map(rownames_to_column) %>%
  bind_rows %>%
  group_by(rowname) %>%
  summarise_all(sum, na.rm = TRUE)

# A tibble: 2 x 5
  rowname     A     B     C     D
  <chr>   <int> <int> <int> <int>
1 1           2     1     2     1
2 2           4     2     4     2
0 голосов
/ 17 января 2019
nm1 = names(df1)
nm2 = names(df2)
nm = intersect(nm1, nm2)

if (length(nm) == 0){                  # if no column names in common
    cbind(df1, df2)
} else {                               # if column names in common
    cbind(df1[!nm1 %in% nm2],          # columns only in df1
          df1[nm] + df2[nm],           # add columns common to both
          df2[!nm2 %in% nm1])          # columns only in df2
}
#  D A C B
#1 1 2 2 1
#2 2 4 4 2
0 голосов
/ 17 января 2019

Используя left_join() из dplyr, вы не потеряете столбец

library(tidyverse)

dat1 <- tibble(a = 1:10,
               b = 1:10,
               c = 1:10)

dat2 <- tibble(c = 1:10,
               d = 1:10, 
               e = 1:10)

left_join(dat1, dat2, by = "c")
#> # A tibble: 10 x 5
#>        a     b     c     d     e
#>    <int> <int> <int> <int> <int>
#>  1     1     1     1     1     1
#>  2     2     2     2     2     2
#>  3     3     3     3     3     3
#>  4     4     4     4     4     4
#>  5     5     5     5     5     5
#>  6     6     6     6     6     6
#>  7     7     7     7     7     7
#>  8     8     8     8     8     8
#>  9     9     9     9     9     9
#> 10    10    10    10    10    10

Создано в 2019-01-16 с помощью пакета Представить (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...