考虑A,B,C,D ....作为单词。 我有两个DF。
ColA
A B
B C
C D
E F
G H
A M
M
ColB
A B C D X Y Z
C D M N F K L
S H A F R M T U
操作: 我想在df2中搜索df1的所有元素,然后将所有匹配的值附加到新列中,或者可以创建多行。
ColB COlB
A B C D X Y Z A,A B,B C,C D
C D M N F K L C D,M
S H A F R M T U A,A M
ColB Output
A B C D X Y Z A
A B C D X Y Z A B
A B C D X Y Z B C
A B C D X Y Z C D
C D M N F K L C D
C D M N F K L M
S H A F R M T U A
S H A F R M T U A M
答案 0 :(得分:1)
我认为这会做到这一点,虽然它与你预期的答案略有不同,我认为这是错误的。
首先设置输入数据框:
# set up the data
df1 <- data.frame(ColA = c("A B",
"B C",
"C D",
"E F",
"G H",
"A M",
"M"),
stringsAsFactors = FALSE)
df2 <- data.frame(ColB = c("A B C D X Y Z",
"C D M N F K L",
"S H A F R M T"),
stringsAsFactors = FALSE)
接下来,我们将形成要搜索的事物的所有成对组合:
# create a vector of patterns and items to search
intermediate <- as.vector(outer(df2$ColB, df1$ColA, paste, sep = "|"))
# split it into a list
intermediate <- strsplit(intermediate, "|", fixed = TRUE)
然后我们可以创建一个函数来匹配这个完整组合数据集的每一行的元素。核心是foundMatch
,它返回一个逻辑,表明ColA
中的所有元素是否都存在于{{1}中}}。在你的例子中,顺序并不重要,所以在这里我们分割元素并查找第一个元素。
ColB
不完全是你所拥有的,但我认为这是正确的。
答案 1 :(得分:0)
对我来说,如何构建data.frames df1
和df2
并不明显。但您可以尝试矢量化数据并匹配两组。
d1 <- sort(as.character(unlist(df1)))
d2 <- sort(as.character(unlist(df2)))
# get the intersection/difference without duplicates
intersect(d1,d2)
setdiff(d1,d2)
# get all values matching with the first or with the second dataset, respectively
d1[ d1 %in% d2 ]
d2[ d2 %in% d1 ]