我的数据集当然要大得多,但原理是一样的:
library(tidyverse)
df <- tibble(Name1 = c("Joe", "Harry", "Jane", NA, NA),
Name2 = c("Joe", "Harry", "Thomas", "Bill", "Jane"))
Name2
("Thomas"
和"Bill"
中提取值
Name1
中遗失了哪些人"Thomas"
} "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
下方?这种方式是否能够以一种整齐的方式行事?
答案 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))
但总的来说,我并不了解你在做什么。由于您将这些向量放在数据框中,因此两个向量需要具有相同的长度。此外,你显然不关心顺序,你只需要那里的名字,这意味着,给定相同的长度,相同的名称。因此你可以用另一个覆盖一个......