【问题标题】:How do I merge two columns from two datasets in r and include all the elements from one data frame except when they are NA?如何合并 r 中两个数据集的两列并包括一个数据框中的所有元素,除非它们是 NA?
【发布时间】:2020-04-09 02:19:52
【问题描述】:

我有两个数据集。一个比另一个长得多,但我想将较小数据集中的纬度/经度放到较大的数据集中。

我的第一个数据集(长的),有一些错误的纬度和经度(它们实际上并没有说正确和错误,它们是坐标):

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

需要明确的是,较小数据集中的所有纬度和经度都是正确的,因此应始终替换较大数据集中的值。

关于如何做到这一点的任何建议?提前感谢您的帮助。

【问题讨论】:

标签: r merge dataset latitude-longitude coalesce


【解决方案1】:

试试这些:

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

数据表

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) ]

【讨论】:

  • 这能回答你的问题吗?如果是这样,请accept it。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-03-01
  • 2021-03-01
  • 1970-01-01
  • 2016-07-08
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
相关资源
最近更新 更多