R 循环2个数据帧以标识连接的类似列

R 循环2个数据帧以标识连接的类似列,r,R,我这里有两个可复制的数据帧。我试图确定哪些列包含与另一列相似的值。我希望我的代码将从每列中随机选择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", "Watermelo

我这里有两个可复制的数据帧。我试图确定哪些列包含与另一列相似的值。我希望我的代码将从每列中随机选择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的列名=来自df2的列名,而row1下的值=来自df1的列名

“杂货店”列与“水果”列匹配,因为有一个匹配值,即在“地点”和“位置”列中分别可以找到苹果和日本


谢谢大家!

做出了改变。虽然很凌乱,但它很管用

#create data frame of column combinations
col_combos <- expand.grid(names(df1), names(df2))

#identify like columns
like_cols <- na.omit(col_combos[as.logical(apply(col_combos, 1, function(x) intersect(df1[, x[1] ],df2[, x[2] ]) > 1 )), ])

#match like columns
rbind(names(df2), as.character(like_cols$Var1)[match(names(df2), as.character(like_cols$Var2))])

     [,1]      [,2]       [,3]      [,4]    
[1,] "grocery" "place"    "invoice" "source"
[2,] "fruit"   "location" NA        NA   

做了一个改变。虽然很凌乱,但它很管用

#create data frame of column combinations
col_combos <- expand.grid(names(df1), names(df2))

#identify like columns
like_cols <- na.omit(col_combos[as.logical(apply(col_combos, 1, function(x) intersect(df1[, x[1] ],df2[, x[2] ]) > 1 )), ])

#match like columns
rbind(names(df2), as.character(like_cols$Var1)[match(names(df2), as.character(like_cols$Var2))])

     [,1]      [,2]       [,3]      [,4]    
[1,] "grocery" "place"    "invoice" "source"
[2,] "fruit"   "location" NA        NA   

这可能不是最理想的解决方案,但是使用double sapply的一种方法,因为对于df2的每一列,我们都希望在df1中找到类似的列


这将为您提供df2中至少在一个值上与df1中的值匹配的所有列。然后,您可以在以后手动更改源列,因为如果存在一行,您就知道它来自df1。

这可能不是最佳解决方案,但是使用double sapply的一种方法,因为对于df2的每一列,我们都希望在df1中找到类似的列


这将为您提供df2中至少在一个值上与df1中的值匹配的所有列。然后,您可以稍后手动更改源列,因为如果存在一行,您就知道它来自df1。

实际上并不清楚您的输出。这是否意味着输出中始终只有一行?是否总是将来自df2的列名作为df3的列名,将来自df1的列名作为第一行?您好,Ronak,是的,它将只有一行。是的,df3下的列名将始终来自df2,而行值来自DF1,因此类似于setNamesdata.frametnamesdf1,namesdf2?不,它必须在数据帧中循环,以确定哪些列与哪些列匹配,而不是通过setNames方法。您可以看到,在发票下,它是NA,因为在DF1中找不到发票下的值。这显然是可行的,但您应该定义类似的值。如果你说食品杂货的价值与水果相似,你是什么意思?一个匹配值是否足够?还是两个?还是全部?或者,如果一个变量包含DF1和DF2,而另一个变量包含DF3和DF4,它们是否相似?实际上,您的输出并不清楚。这是否意味着输出中始终只有一行?是否总是将来自df2的列名作为df3的列名,将来自df1的列名作为第一行?您好,Ronak,是的,它将只有一行。是的,df3下的列名将始终来自df2,而行值来自DF1,因此类似于setNamesdata.frametnamesdf1,namesdf2?不,它必须在数据帧中循环,以确定哪些列与哪些列匹配,而不是通过setNames方法。您可以看到,在发票下,它是NA,因为在DF1中找不到发票下的值。这显然是可行的,但您应该定义类似的值。如果你说食品杂货的价值与水果相似,你是什么意思?一个匹配值是否足够?还是两个?还是全部?或者,如果一个变量包含DF1和DF2,而另一个变量包含DF3和DF4,它们是否相似
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