我有两个数据帧,我想将纬度和经度从一个df传输到另一个。 DF1缺少大部分经纬度,但是DF2在经纬度工具中也缺少一些值。我想匹配其位置ID(loc_id),但并非DF1中的所有行都具有loc_id。
reg_id <- c(1,2,3,4,5,6,7)
loc_id <- c(NA,1,1,NA,2,3,4)
lat <- c(NA,12.56,12.56,NA,NA,13.757,NA)
long <- c(NA,-31.2,-31.2,NA,NA,-56.43,NA)
DF1 <- data.frame(reg_id,loc_id,lat,long)
loc_id <- c(1,2,3,4,5,60)
loc_lat <- c(12.56,20.7,13.757,NA,20.3,50.7)
loc_long <- c(-31.2,-47.3,-56.43,NA,-71.123,-27.1)
DF2 <- data.frame(loc_id,loc_lat,loc_long)
目标是最终得到这样的df:
reg_id loc_id lat long
1 NA NA NA
2 1 12.56 -31.2
3 1 12.56 -31
4 NA NA NA
5 2 20.7 -47.3
6 3 13.757 -56.43
7 4 NA NA
注意:每行的纬度和经度都不相同。
谢谢您的帮助!
仅出于某种背景,我尝试将setDT
,merge
匹配无济于事。
no_ll_DF1 <- which(is.na(DF1$lat) & !is.na(DF1$loc_id))
yes_ll_DF2 <- which(!is.na(DF2$loc_lat))
DF1$lat[match(DF2$loc_id[yes_ll_DF2], DF1$loc_id[no_ll_DF1])] <- DF2$loc_lat[yes_ll_DF2]
使用match时,会出现此错误:
DF1 $ lat [match(DF2 $ loc_id [yes_ll_DF2],DF1 $ loc_id [no_ll_DF1])]错误-DF2 $ loc_lat [yes_ll_DF2]: 下标作业中不允许使用NAs
答案 0 :(得分:0)
使用tidyverse
软件包进行此操作的一种方式
library(tidyverse)
# left join to keep all DF1 and add only matching loc_id in DF2
DF1 %>% left_join(DF2,by="loc_id") %>%
# replace missing lat and long if we have a match in DF2
mutate(lat=ifelse(is.na(lat),loc_lat,lat),
long=ifelse(is.na(long),loc_long,long)) %>%
# remove loc_lat and loc_long columns from dataframe
select(-loc_lat,-loc_long)