объединять и обновлять несуществующие значения - PullRequest
0 голосов
/ 18 февраля 2020

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

df1 <- data.frame(source = c("Pr1", "Pr2","Pr3"),
                     date = c("Jan 2018","Feb 2018","Mar 2018"),
                     Freq = c(100,20,30))
df2 <- data.frame(source = c("Pr1","Pr2","Pr1"),
                     date = c("Sep 2018","Aug 2018","Jan 2018"),
                     Freq = c(0,0,0))

df <- merge(df1,df2,by = c("source","date"))

Ожидаемый результат:

  source     date Freq
1    Pr1 Jan 2018  100
2    Pr2 Feb 2018   20
3    Pr3 Mar 2018   30
4    Pr1 Sep 2018    0
5    Pr2 Aug 2018    0

Ответы [ 3 ]

2 голосов
/ 18 февраля 2020

Требуется полное соединение

df3 <- merge(df1, df2, by = c("source", "date"), all = TRUE, suffixes = c("", ".y"))
df3$Freq[is.na(df3$Freq)] <- df3$Freq.y[is.na(df3$Freq)]

  source     date Freq Freq.y
1    Pr1 Jan 2018  100      0
2    Pr1 Sep 2018    0      0
3    Pr2 Feb 2018   20     NA
4    Pr2 Aug 2018    0      0
5    Pr3 Mar 2018   30     NA
2 голосов
/ 18 февраля 2020

Может быть, вы можете установить all = TRUE при использовании merge и применить aggregate для обновления, т. Е.

df <- aggregate(Freq~.,merge(df1,df2,all = TRUE),FUN = max)

так, чтобы

> df
  source     date Freq
1    Pr2 Feb 2018   20
2    Pr1 Jan 2018  100
3    Pr3 Mar 2018   30
4    Pr2 Aug 2018    0
5    Pr1 Sep 2018    0
1 голос
/ 18 февраля 2020

Вот ответ tidyverse / dplyr.

library(tidyverse)

df1 <- data.frame(source = c("Pr1", "Pr2","Pr3"),
                  date = c("Jan 2018","Feb 2018","Mar 2018"),
                  Freq = c(100,20,30))
df2 <- data.frame(source = c("Pr1","Pr2","Pr1"),
                  date = c("Sep 2018","Aug 2018","Jan 2018"),
                  Freq = c(0,0,0))

df <- full_join(df1,df2,by = c("source","date"))
  source     date Freq.x Freq.y
1    Pr1 Jan 2018    100      0
2    Pr2 Feb 2018     20     NA
3    Pr3 Mar 2018     30     NA
4    Pr1 Sep 2018     NA      0
5    Pr2 Aug 2018     NA      0
final_df <- df %>%
  mutate(Frequency = if_else(is.na(Freq.x), Freq.y, Freq.x)) %>%
  select(source, date, Frequency)
  source     date Frequency
1    Pr1 Jan 2018       100
2    Pr2 Feb 2018        20
3    Pr3 Mar 2018        30
4    Pr1 Sep 2018         0
5    Pr2 Aug 2018         0

Просто обратите внимание на поведение if_else () - он будет сохранять частоту df1, если он равен 0 (не NA).

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