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

时间:2017-10-18 14:56:00

标签: r if-statement dplyr tidyverse

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

library(tidyverse)
df <- tibble(Name1 = c("Joe", "Harry", "Jane", NA, NA),
       Name2 = c("Joe", "Harry", "Thomas", "Bill", "Jane"))
  • 问题1 :如何在Name2"Thomas""Bill"中提取值 Name1中遗失了哪些人"Thomas"}
  • 问题2 :如何粘贴这些值("Bill"Name1)    "Jane"中的值停在DECLARE @xml XML = ' <ElementA> <ElementAA>false</ElementAA> <ElementAB> <SubElementB>-1</SubElementB> <SubElementB>2</SubElementB> <SubElementB>3</SubElementB> <SubElementB>-4</SubElementB> </ElementAB> <ElementAC>Some text for element AC</ElementAC> </ElementA>'; SELECT @xml.value(N'(/ElementA/ElementAA/text())[1]',N'nvarchar(max)') AS ElementAA ,STUFF((SELECT ',' + se.value(N'text()[1]',N'nvarchar(max)') FROM @xml.nodes(N'/ElementA/ElementAB/SubElementB') AS A(se) FOR XML PATH('')),1,1,'') AS ListOfSubElementB ,@xml.value(N'(/ElementA/ElementAC/text())[1]',N'nvarchar(max)') AS ElementAC 下方?

这种方式是否能够以一种整齐的方式行事?

2 个答案:

答案 0 :(得分:1)

您可以在此使用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

答案 1 :(得分:1)

到第一个问题:

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解决方案,这也是一样的:

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

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