r - 循环遍历 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 列中找到。
谢谢!
解决方案
这可能不是最佳解决方案,而是使用 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
。
推荐阅读
- c# - .Exe 文件未通过任务计划程序 C# 提供输出
- java - 更改语言的 setLocale 在 Android 中无效
- sql - 如果一个表中可能没有相应的条目,如何连接两个表并计算连接匹配的次数?
- pgadmin-4 - pgAdmin 4 窗口完全空白
- objective-c - WatchKit:视频时长
- google-sheets - 如何将保存在 Google Drive 上的制表符分隔 (TSV) 文件导入 Google 表格?
- puppeteer-sharp - IIS 中的 PuppeteerSharp
- javascript - 为基本的 React 老虎机创建动画
- php - 为什么升级到 Symfony 4.4 后我不再看到错误预览页面?
- windows - 获取 Windows 格式的 Jenkins 管道 WORKSPACE 环境变量