如何对比列名存在差异的两个DataFrame,筛选值更高的列子集?
解决方法
首先先还原你的示例数据(R代码):
# 构造myDat myDat <- data.frame( firstA = 13, firstB = 4, secondA = 40, secondB = 24, thirdA = 16, thirdB = 10 ) # 构造comparisonDat comparisonDat <- data.frame( first = 18, second = 35, third = 8 )
接下来按以下步骤处理:
- 第一步:提取myDat列名的前缀(去掉末尾的A/B),用来匹配comparisonDat的列
# 提取列名前缀,比如"firstA"变成"first" col_prefixes <- gsub("[AB]$", "", colnames(myDat))
这里用gsub("[AB]$", "", ...)精准去掉列名末尾的A或B,不会影响其他位置的字符,完全能保留和comparisonDat的对应关系。
- 第二步:根据前缀匹配,从comparisonDat中取出对应的值,生成和myDat列数一致的对比向量
# 匹配对应对比值 comparison_vals <- comparisonDat[1, col_prefixes]
因为comparisonDat只有一行,取第一行,按col_prefixes的顺序取值,得到的向量顺序和myDat的列完全对应。
- 第三步:筛选myDat中值大于对应对比值的列
# 筛选符合条件的列 myDat_comparison <- myDat[, myDat > comparison_vals, drop = FALSE]
drop = FALSE是为了避免结果只剩一列时自动转成向量,保证输出还是数据框。
运行完后,myDat_comparison就是你要的结果:
> myDat_comparison secondA thirdA thirdB 1 40 16 10
补充说明
这种方法的优势是不用修改myDat的原始列名,完全通过前缀匹配来对应对比值,既解决了列名不匹配的问题,又保留了原始列的标识。如果后续需要用到原始列名,也能直接调用。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

