Я пытаюсь объединить два фрейма данных таким образом, чтобы в случае отсутствия столбцов, присутствующих в переменных 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
r
0
prog 18 Фев 2020 в 18:16

3 ответа

Лучший ответ

Может быть, вы можете установить 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
2
ThomasIsCoding 18 Фев 2020 в 15:43

Вот ответ 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).

1
TTS 18 Фев 2020 в 15:24

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

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
manotheshark 18 Фев 2020 в 15:26