[英]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?
我有兩個數據集。 一個比另一個長得多,但我想將較小數據集中的緯度/經度放到較大的數據集中。
我的第一個數據集(長數據集)有一些錯誤的緯度和經度(它們實際上並沒有說正確和錯誤,它們是坐標):
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
需要明確的是,較小數據集中的所有緯度和經度都是正確的,因此應始終替換較大數據集中的值。
關於如何做到這一點的任何建議? 預先感謝您的幫助。
試試這些:
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
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
或者,如果您更喜歡 pipe 與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) ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.