You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无视列顺序匹配两个字符串型数据框的行?

解决字符串数据框行匹配问题(忽略列顺序)

针对字符串类型的数据框,需要匹配两个数据框中元素组合相同的行(不管列的顺序),以下是两种可行方案:

方法1:生成标准化行键

核心思路是给每行生成一个唯一标准化键——将每行的字符串排序后拼接,这样元素组合相同的行(不管列顺序)会拥有相同的键,再通过键完成匹配。

代码示例

# 示例测试数据
df1 <- data.frame(name_1 = c("A", "B", "C"),
                  name_2 = c("C", "D", "B"))
df2 <- data.frame(name_1 = c("C", "D", "C"),
                  name_2 = c("A", "B", "D"))

# 为每行生成标准化键:排序后拼接
df1$key <- apply(df1, 1, function(x) paste(sort(x), collapse = "-"))
df2$key <- apply(df2, 1, function(x) paste(sort(x), collapse = "-"))

# 匹配并输出指定格式结果
matched_result <- merge(df1, df2, by = "key")[, c("name_1.y", "name_2.y")]
colnames(matched_result) <- c("Genes_1", "Genes_2")
print(matched_result)

输出结果

Genes_1 Genes_2
1       C       A
2       D       B

获取匹配行索引

如果需要获取df2中匹配df1的行索引:

match_indices <- match(df1$key, df2$key)
print(match_indices)

输出:[1] 1 2 NA(第三行无匹配,返回NA)


方法2:调换列后合并(优化你的尝试)

基于你之前的思路,通过复制并调换df2的列名,执行两次合并后取结果:

代码示例

# 示例测试数据
df1 <- data.frame(name_1 = c("A", "B", "C"),
                  name_2 = c("C", "D", "B"))
df2 <- data.frame(name_1 = c("C", "D", "C"),
                  name_2 = c("A", "B", "D"))

# 复制df2并调换列名
df3 <- df2
colnames(df3) <- c("name_2", "name_1")

# 两次合并并合并结果
result1 <- merge(df1, df2, by = c("name_1", "name_2"))
result2 <- merge(df1, df3, by = c("name_1", "name_2"))
final_result <- rbind(result1, result2)

# 重命名列
colnames(final_result) <- c("Genes_1", "Genes_2")
print(final_result)

适配实际字符串数据

对于包含字母和数字的完整字符串(如你的AB1C、DOR5F案例),上述两种方法完全适用,只需替换示例数据即可:

# 实际数据示例
df1 <- data.frame(names_1 = c("AB1C", "BR2G"),
                  names_2 = c("CFG", "DOR5F"))
df2 <- data.frame(names_1 = c("CFG", "DOR5F"),
                  names_2 = c("AB1C", "BR2G"))

# 复用方法1的代码即可完成匹配

内容的提问来源于stack exchange,提问作者Sky Scraper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:23:30