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"))
- 问题 1:如何提取
Name2
中的值("Thomas"
和
"Bill"
) Name1
谁失踪了?
- 问题 2:如何粘贴这些值(
"Thomas"
和 "Bill"
)
Name1
中的值在 "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))
但总的来说,我不太了解你在做什么。由于您将这些向量放在数据框中,因此两个向量的长度必须相同。此外,您显然不关心顺序,您只想要其中的名称,这意味着,给定相同的长度,相同的名称。因此你可以用另一个覆盖一个...
我的数据集当然要大得多,但原理是一样的:
library(tidyverse)
df <- tibble(Name1 = c("Joe", "Harry", "Jane", NA, NA),
Name2 = c("Joe", "Harry", "Thomas", "Bill", "Jane"))
- 问题 1:如何提取
Name2
中的值("Thomas"
和"Bill"
)Name1
谁失踪了? - 问题 2:如何粘贴这些值(
"Thomas"
和"Bill"
)Name1
中的值在"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))
但总的来说,我不太了解你在做什么。由于您将这些向量放在数据框中,因此两个向量的长度必须相同。此外,您显然不关心顺序,您只想要其中的名称,这意味着,给定相同的长度,相同的名称。因此你可以用另一个覆盖一个...