Как объединить два столбца из двух наборов данных в r и включить все элементы из одного фрейма данных, кроме случаев, когда они являются NA? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть два набора данных. Один существенно длиннее другого, но я хочу поместить широты / долготы из меньшего набора данных в больший.

Мой первый набор данных (длинный) имеет некоторые неправильные широты и долготы (на самом деле они не говорят правильные и неправильные, это координаты):

country city latitude longitude
usa      xyz  wrong   wrong
usa      abc  wrong   wrong
usa      iff  correct correct
usa      sfo  correct correct
usa      lax  correct correct

Второй набор данных короче, но содержит правильные латы и долготы только для координат, которые необходимо зафиксировать:

country city latitude longitude
usa      xyz  correct  correct
usa      abc  correct  correct

Я хочу получить следующее:

country city latitude longitude
usa      xyz  correct correct
usa      abc  correct correct
usa      iff  correct correct
usa      sfo  correct correct
usa      lax  correct correct

Чтобы быть понятным, все широты и долготы в меньшем наборе данных верны и поэтому всегда должны заменять значения в большем.

Есть предложения, как это сделать? Заранее благодарю за помощь.

1 Ответ

1 голос
/ 09 апреля 2020

Попробуйте:

merged <- merge(original, fixes, by = c("country", "city"), all = TRUE)
merged
#   country city latitude.x longitude.x latitude.y longitude.y
# 1     usa  abc      wrong       wrong    correct     correct
# 2     usa  iff    correct     correct       <NA>        <NA>
# 3     usa  lax    correct     correct       <NA>        <NA>
# 4     usa  sfo    correct     correct       <NA>        <NA>
# 5     usa  xyz      wrong       wrong    correct     correct
merged <- transform(merged,
  latitude = ifelse(is.na(latitude.y), latitude.x, latitude.y),
  longitude = ifelse(is.na(longitude.y), longitude.x, longitude.y)
)[, c("country", "city", "latitude", "longitude")]
merged
#   country city latitude longitude
# 1     usa  abc  correct   correct
# 2     usa  iff  correct   correct
# 3     usa  lax  correct   correct
# 4     usa  sfo  correct   correct
# 5     usa  xyz  correct   correct

dplyr

library(dplyr)
original %>%
  left_join(fixes, by = c("country", "city")) %>%
  mutate(
    latitude = if_else(is.na(latitude.y), latitude.x, latitude.y),
    longitude = if_else(is.na(longitude.y), longitude.x, longitude.y)
  ) %>%
  select(-contains("."))
#   country city latitude longitude
# 1     usa  xyz  correct   correct
# 2     usa  abc  correct   correct
# 3     usa  iff  correct   correct
# 4     usa  sfo  correct   correct
# 5     usa  lax  correct   correct

data.table

library(data.table)
originalDT <- as.data.table(original)
fixesDT <- as.data.table(fixes)
fixesDT[originalDT, on = c("country", "city")][
 ,c("latitude", "longitude") :=
    .(fifelse(is.na(latitude), i.latitude, latitude),
      fifelse(is.na(longitude), i.longitude, longitude)) ][
        , .(country, city, latitude, longitude) ]
#    country city latitude longitude
# 1:     usa  xyz  correct   correct
# 2:     usa  abc  correct   correct
# 3:     usa  iff  correct   correct
# 4:     usa  sfo  correct   correct
# 5:     usa  lax  correct   correct

или, если вы предпочитаете внешний вид трубы с data.table, затем

library(magrittr)
fixesDT[originalDT, on = c("country", "city")] %>%
  .[, c("latitude", "longitude") :=
        .(fifelse(is.na(latitude), i.latitude, latitude),
          fifelse(is.na(longitude), i.longitude, longitude)) ] %>%
  .[, .(country, city, latitude, longitude) ]
...