Объедините кадры данных и значения перезаписи в таблице 1 со всеми значениями в таблице 2 - PullRequest
0 голосов
/ 16 июня 2019

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

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

merge.data.frame(x, y, by.x = "Name", by.y = "Name")
merge.data.frame(x, y, by.x = "SN", all.x = FALSE,y all.y = TRUE)

Переменные, используемые для этого, показаны ниже

x <- data.frame("SN" = 1:4, "Age" = c(21,15,44,55), "Name" = c("John","Dora", NA, NA))
y <- data.frame("SN" = 4, "Age" = c(100), "Name" = c("B"))
  SN Age Name       # x dataframe
1  1  21 John 
2  2  15 Dora 
3  3  44  NA 
4  4  55  NA

  SN Age Name       # y dataframe
5  4 100  B

Окончательный результат кадра данных должен быть следующим:

Присоединяется к «SN» и перезаписывает значения в столбцах «Возраст» и «Имя», заменяя то, что в х, на то, что в у.

  SN Age Name       # result
1  1  21 John 
2  2  15 Dora 
3  3  44  NA 
4  4 100  B

Редактировать: Если у вас есть дополнительные столбцы, как показано на приведенном ниже кадре данных, которых нет в y

  SN Gender Age Name       # z table with additional column
1  1   M    21  John 
2  2   F    15  Dora 
3  3   M    44   NA 
4  4   M    55   NA

Запуск приведенного ниже кода из пакета plyr приведет к удалению ненужных столбцов

library(plyr)
rbind.fill(z[!z$SN %in% y$SN,], y[,])
  SN Gender Age Name       # result if additional columns are present in z and not in y
1  1   M    21  John 
2  2   F    15  Dora 
3  3   M    44   NA 
4  4   M    100  B

Ответы [ 2 ]

4 голосов
/ 16 июня 2019

Вы можете удалить SN значения в x, которые соответствуют SN значениям в y, а затем связать строки для двух кадров данных.

rbind(x[!x$SN %in% y$SN,], y) 

  SN Age Name
1  1  21 John
2  2  15 Dora
3  3  44 <NA>
4  4 100    B
2 голосов
/ 16 июня 2019

Более простое решение, которое я считаю более простым для чтения, - это сначала отфильтровать строки в x, которые предварительно представлены в y, а затем добавить y к x.

# Added stringsAsFactors as False in df's.
x <- data.frame("SN" = 1:4, "Age" = c(21,15,44,55), "Name" = c("John","Dora", NA, NA), stringsAsFactors = F)
y <- data.frame("SN" = 4, "Age" = c(100), "Name" = c("B"), stringsAsFactors = F)

# Joins
x %>% 
  anti_join(y, by = c("SN")) %>%  # Remove row from x that are in y
  bind_rows(y)                    # Add rows from y to x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...