Return 两个变量之一中缺少的值 R

Return values that are missing in one of the two variables R

我的数据集当然要大得多,但原理是一样的:

library(tidyverse)
df <- tibble(Name1 = c("Joe", "Harry", "Jane", NA, NA),
       Name2 = c("Joe", "Harry", "Thomas", "Bill", "Jane"))

这是否可以以一种整洁的方式实现?

你可以在这里使用data.table

library(tidyverse)
library(data.table)

df <- tibble(Name1 = c("Joe", "Harry", "Jane", NA, NA),
         Name2 = c("Joe", "Harry", "Thomas", "Bill", "Jane"))

df <- data.table(df)

df[is.na(Name1), "Name1"] <- df[!Name2 %in% Name1, "Name2"]
df
    Name1  Name2
1:    Joe    Joe
2:  Harry  Harry
3:   Jane Thomas
4: Thomas   Bill
5:   Bill   Jane

第一个问题:

setdiff(df$Name2, df$Name1)

为您提供未出现在 Name1 中的名称。这也是一样的:

df$Name2[!df$Name2 %in% df$Name1]

您现在可以将缺失值插入数据框中(问题 2):

df$Name1[is.na(df$Name1)] <- setdiff(df$Name2, df$Name1)

或:

df$Name1[is.na(df$Name1)] <- df$Name2[!df$Name2 %in% df$Name1]

如果你想要 tidyverse/dplyr-solution,这也是一样的:

library(tidyverse)
df %>% mutate(Name1 = ifelse(is.na(Name1), Name2[!Name2%in%Name1], Name1))

但总的来说,我不太了解你在做什么。由于您将这些向量放在数据框中,因此两个向量的长度必须相同。此外,您显然不关心顺序,您只想要其中的名称,这意味着,给定相同的长度,相同的名称。因此你可以用另一个覆盖一个...