通过匹配在数据框中搜索这些值来替换缺失值

Replacing missing values by searching dataframe for those values by matching

我有一个包含约 500,000 个观察值的数据框,一些列有空白,例如一个失踪的名字。然而,名称与 ID 相对应,有时名称或 ID 都存在,但有时缺少一个或另一个。有没有办法通过df搜索,找到并匹配缺失的数据

所以在这个简单的例子中

structure(list(Names = c("Jon", "Al", "Phil", "Sarah", "Jon", 
" "), ID = c(12, 14, 16, 18, 12, 14)), class = "data.frame", row.names = c(NA, 
-6L))


df

  Names ID
1   Jon 12
2    Al 14
3  Phil 16
4 Sarah 18
5   Jon 12
6       14

我知道 14 与 Al 匹配,所以我可以用 Al 替换第 6 行的空白。 但是,如何在具有多个缺失值的情况下更大规模地执行此操作?

假设 ID 只有一个唯一的 'Names' - 按 'ID' 分组并替换空白的 'Names' ("")第一个 'Names'

library(dplyr)
df %>%
   mutate(Names = trimws(Names)) %>%
   group_by(ID) %>% 
   mutate(Names = replace(Names, Names == "", 
           first(Names[Names != ""]))) %>% 
   ungroup

-输出

# A tibble: 6 × 2
  Names    ID
  <chr> <dbl>
1 Jon      12
2 Al       14
3 Phil     16
4 Sarah    18
5 Jon      12
6 Al       14

另一种选择是将 "" 替换为 NA,然后使用 fill 将缺失值替换为 'ID' 与非 NA 相邻名称

library(tidyr)
df %>% 
   mutate(Names = na_if(trimws(Names), "")) %>% 
   group_by(ID) %>% 
   fill(Names, .direction = 'downup') %>%
   ungroup
# A tibble: 6 × 2
  Names    ID
  <chr> <dbl>
1 Jon      12
2 Al       14
3 Phil     16
4 Sarah    18
5 Jon      12
6 Al       14