Объединение двух наборов данных на основе столбца в R - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть два набора данных, изначально из одного источника, но из-за категоризации я счел необходимым разделить их. Мне было интересно, как объединить эти наборы данных на основе пропущенных значений из двух столбцов? Другими словами, мне нужны все строки (столбцы идентичны, поскольку они из одного источника) из набора данных 1, а затем на основе столбцов, указывающих годы и код страны, если строки отсутствуют в наборе данных 1, извлекать строки из набора данных 2?

df1 <- read.table(
text =
"Year, Data,Country
1,2,US
3,2,US
5,1,US
1,3,UK
2,5,UK
4,3,UK
", sep = ",", header = TRUE)
df1

df2 <- read.table(
text =
"Year, Data,Country
1,3,US
4,5,US
5,8,US
2,9,UK
3,4,UK
", sep = ",", header = TRUE)
df2

df3 <- read.table(
text =
"Year, Data,Country
1,2,US
3,2,US
4,5,US
5,1,US
1,3,UK
2,5,UK
3,4,UK
4,3,UK
", sep = ",", header = TRUE)
df3

df3 извлекает значения отсутствующих годов из df1 и df2. Как будет кодироваться это извлечение?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Вы можете сделать full_join и выбрать значение не-NA между Data.x и Data.y, используя coalesce.

library(dplyr)

full_join(df1, df2,  by = c('Country', 'Year')) %>%
   mutate(Date = coalesce(Data.x, Data.y)) %>%
   select(-Data.x, -Data.y) %>%
   arrange(Country)

#  Year Country Date
#1    1      UK    3
#2    2      UK    5
#3    4      UK    3
#4    3      UK    4
#5    1      US    2
#6    3      US    2
#7    5      US    1
#8    4      US    5

Те же логики c в базе R:

transform(merge(df1, df2, by = c('Country', 'Year'), all = TRUE), 
          Data = ifelse(is.na(Data.x), Data.y, Data.x))[names(df1)]
0 голосов
/ 05 апреля 2020

Добро пожаловать в Stackoverflow !!! В следующий раз, пожалуйста, предоставьте образец ваших данных, а не ссылку, изображение или ссылку на изображение. Например, я создаю пример данных для тестирования решения, используя read.table(). Данные могут быть небольшими, поскольку, если решение работает на четырех или пяти строках, оно будет работать на всех строках. Это особенно верно, если решение векторизовано, как показано ниже:

df1 <- read.table(
text =
"Year, Data
1,2
2,4
3,2
5,1
", sep = ",", header = TRUE)

df2 <- read.table(
text =
"Year, Data
1,3
2,4
4,5
5,8
", sep = ",", header = TRUE)

Далее мы просто извлекаем строку, которая не находится в первом кадре данных, и rbind в первый кадр данных. Нам нужно указать drop = T, чтобы строки были связаны номером строки, что помещает строку из df2 в четвертую строку нового фрейма данных, в противном случае она будет помещена в конец нового фрейма данных.

new_yr <- which(!(df2$Year %in% df1$Year))

df <- rbind(df1[, , drop = T], df2[new_yr, , drop = T])

df
Year Data
1    1    2
2    2    4
3    3    2
4    5    1
5    4    5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...