R查找两个数据帧的列中的字符串之间的重叠部分

问题描述 投票:1回答:2

我具有以下数据帧df1和df2。这些只是示例,我的真实数据框大约有1000行和10列。

df1 = data.frame(V1 = c(1,2), V2 = c("a, b, d", "c, g"))

> df1
  V1         V2
1  1    a, b, d
2  2       c, g

df2 = data.frame(V3 = c(1,2,3), V4 = c("a, c", "b, e", "a, g"))

> df2
  V3      V4
1  1    a, c
2  2    b, e
3  3    a, g

如您所见,第V2和V4列包含用“,”分隔的值>

我现在想逐行遍历df1,并检查V2中存在的任何值是否与V4中存在的值之一匹配。因此,我不想比较完整的列内容,而是要比较每个值的价值。

这是我的输出df3的外观

df3 = data.frame(V1 = c(1, 1, 1, 2, 2), V2 = c("a, b, d", "a, b, d", "a, b, d", "c, g", "c, g"), V5 = c("a","a","b","c","g"), V3 = c(1, 3, 2, 1, 3), V4 = c("a, c","a, g", "b, e", "a, c", "a, g"), V6 = c("a", "a","b", "c", "g"))

 df3
  V1      V2 V5 V3   V4 V6
1  1 a, b, d  a  1 a, c  a
2  1 a, b, d  a  3 a, g  a
3  1 a, b, d  b  2 b, e  b
4  2    c, g  c  1 a, c  c
5  2    c, g  g  3 a, g  g

让我们看一下df1的第一行。在V2中,有值“ a”,“ b”和“ d”。我们从“ a”开始,如果V4中存在“ a”,则在df2中查看。这对于df2的第1行和第3行是正确的。我们在输出df3中创建两行。第1行包含第一个匹配项的信息:​​原始列V1,V2,V3和V4 + 2个新列V5和V6,其中分别包含来自df1和df2的匹配值“ a”。

我希望这很清楚。

我将从for循环开始,我认为可能有必要用','分隔列V2,但我不确定是否需要这样做。

for (row in 1:nrow(df1)) {
 // split col V2 of df1 by ','
 // if V2 %in% in df2$V4 ...
}

我具有以下数据帧df1和df2。这些只是示例,我的真实数据框大约有1000行10列。 df1 = data.frame(V1 = c(1,2),V2 = c(“ a,b,d”,“ c,g”))> df1 ...

r string dataframe
2个回答
1
投票

使用separate_rows分隔df1df2上的折叠列,并将它们与inner_join连接在一起。


0
投票

这里是使用merge + strsplit的基本R解决方案>

df3 <- within(merge(df1,df2),
              V5 <- unlist(Map(function(x,y) ifelse(length(u <- intersect(x,y)),u,NA),
                               strsplit(as.character(V2),", "),
                               strsplit(as.character(V4),", "))))


df3 <- (df3 <- subset(df3,complete.cases(df3)))[order(df3$V1),]

© www.soinside.com 2019 - 2024. All rights reserved.