我具有以下数据帧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 ...
使用separate_rows
分隔df1
和df2
上的折叠列,并将它们与inner_join
连接在一起。
这里是使用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),]