【问题标题】:Need to find and extract matching 'Names' from 2 different Name columns of 2 different Data Frames in R需要从 R 中 2 个不同数据框的 2 个不同名称列中查找和提取匹配的“名称”
【发布时间】:2026-02-14 19:50:02
【问题描述】:

我是 R 新手,需要一些指导,我的问题是这样的: 我在两个 dfs 上都有 2 个 dfs 我已经执行了一系列操作,我需要最后执行这个操作

df1 & df2

df1 <- data.frame(name = c("A","B","C","D","E","F","F","G","s","x")) 
#(1)

df1$newname <-  c("A","V","C","D","c","v","x") #(name extracted from other column) (2)

df2 <- data.frame(Id_name = c("A","B","C","s","s", "x","G", "g"))
#(3)

Step1 = 我需要先将 2 与 3 匹配并提取常用名称,我们将其命名为 4

Step2 = 查找 4 中具有重复值的名称 = 1

Step3 = 从 1 和 3 中删除这些值

我尝试使用 anti_join 和 semi_join 但我猜这仅适用于数值,是否有任何特定的库可用于此以及如何解决此问题

【问题讨论】:

  • 我尝试过使用 lib(compare) 也可以找到 df$tm 来获取一些名称,但无法解决我面临的问题
  • 你能让你的例子可重现吗?添加一些模拟数据,您期望的结果是什么。有关如何做到这一点的更多信息,请参阅here

标签: r match character


【解决方案1】:

下面的策略依赖于intersect/extraction:

  1. 使用intersect 获取常用名称。
  2. 删除可在common 中找到的df1$name
  3. 按照第 2 点执行,这次使用 df2$Id_name

它是完全矢量化的,不需要连接。
还要注意参数drop = FALSE。问题中发布的示例只有一列,使用默认的drop = TRUE,结果将失去dim 属性,成为向量。

common <- intersect(newname, df2$Id_name)
df1 <- df1[!df1$name %in% common, , drop = FALSE]
df2 <- df2[!df2$Id_name %in% common, , drop = FALSE]

【讨论】:

  • 请检查刚刚编辑的我的帖子,@Rui- 非常感谢,我想这个逻辑应该可行。
  • @rajeshdhingra 完成,看看现在怎么样。
  • 是的,再次感谢,得到了结果,但需要说明的是,这里的“相交”是否进行完全匹配(区分大小写)?,IMO 正在这样做,是否有部分匹配的选项或任何其他可以忽略小写/大写的选项(只是要求获得见解并供将来使用)
  • @rajeshdhingra intersect(tolower(newname), tolower(df2$Id_name))。但是,您必须在接下来的指令tolower(df1$name)tolower(df2$Id_name) 中执行相同的操作,或者更简单地说,在之前完成所有操作并使用小写的数据集。
  • 好的,肯定会这样做并检查结果,@Rui Barradas 非常感谢。