【问题标题】:How to replace NA values by matching on ID, with two different data frames如何通过在 ID 上匹配两个不同的数据框来替换 NA 值
【发布时间】:2019-10-02 22:42:57
【问题描述】:

我有两个数据框,我想将纬度和经度从一个 df 转移到另一个。 DF1 缺少大部分 lat 和 long,但 DF2 在 lat 和 long 工具中也有一些缺失值。我想匹配他们的位置 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

注意:每行的 lat 和 long 长度不同。

感谢您的帮助!

只是一些背景,我试过匹配,setDTmerge,但无济于事。

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

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    使用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)
    

    【讨论】:

    • 谢谢!不幸的是,我的声望点不到 15,所以我的投票没有被记录下来,但我希望看到这篇文章的人能给你应得的荣誉。
    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多