2017-10-18 46 views
0

我的数据集当然是更大的,但原理是一样的:是缺少在这两个变量中的一个返回值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停止​​3210下的价值?

这是可行的一种纯粹的方式吗?

+0

是的好我编辑我的问题 – Tdebeus

+0

Name1中的名称是否需要匹配Name2? (Name1 = c('Joe','Harry','Thomas','Bill','Jane'),Name2 = c('Joe','Harry', '托马斯','比尔','简'))? – brittenb

回答

1

使用data.table第一个问题:

setdiff(df$Name2, df$Name1) 

为您提供了不名1出现的名字。这确实是相同的:

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

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

1

你可以在这里

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 
+2

这个答案没有使用'data.table'包中的任何东西.... – brittenb

+0

我能够直接使用列名 - 没有'data.table'而没有给出结果 –

+0

@brittenb:你能帮我理解if这里有什么缺失 - 我会纠正我的错误 –