首页 > 解决方案 > 循环遍历 2 个数据框以识别相似的连接列

问题描述

我在这里有 2 个可重现的数据框。我试图确定哪一列包含与另一列相似的值。我希望我的代码会从每列中随机选择 1 个值,并循环遍历 df2 中的每一列。

df1 <- data.frame(fruit=c("Apple", "Orange", "Pear"), location = c("Japan", "China", "Nigeria"), price = c(32,53,12))
df2 <- data.frame(grocery = c("Durian", "Apple", "Watermelon"), place=c("Korea", "Japan", "Malaysia"), invoice = c("XD1", "XD2", "XD3"))

df1$source <- "DF1"
df2$source <- "DF2"

df1

   fruit location price source
1  Apple    Japan    32    DF1
2 Orange    China    53    DF1
3   Pear  Nigeria    12    DF1

df2  
     grocery    place invoice source
1     Durian    Korea     XD1    DF2
2      Apple    Japan     XD2    DF2
3 Watermelon Malaysia     XD3    DF2

这是我希望在名为 df3 的新数据帧下获得的输出。

df3
         grocery    place    invoice source
    1     fruit    location     NA    DF1

源列将允许用户识别各个列(水果/位置)的来源。df3 的列名 = df2 的列名,而 row1 下的值 = df1 的列名。

Grocery 列与水果匹配,因为有一个匹配值,即“Apple”和“Japan”可以分别在 place 和 location 列中找到。

谢谢!

标签: r

解决方案


这可能不是最佳解决方案,而是使用 double 的一种方法sapply(因为df2我们希望在 中找到相似的列df1

sapply(names(df2), function(x) {
     temp <- sapply(names(df1), function(y) 
         if(any(match(df2[[x]], df1[[y]], nomatch = FALSE))) y else NA)
     ifelse(all(is.na(temp)), NA, temp[which.max(!is.na(temp))])
   }
)

# grocery     place     invoice     source 
# "fruit" "location"         NA         NA 

这将为您提供所有列,df2其中match至少一个值与df1. 然后,您可以稍后手动更改该source列,因为如果存在您知道它来自的行df1


推荐阅读