如何筛选两个DataFrame的交集:保留df1$V1与df2列名的共同项
高效筛选DataFrame交集的优雅实现(无需转置)
这种大规模DataFrame的交集筛选确实头疼,手动一个个挑根本不现实,给你个用base R就能搞定的优雅方案,完全不用转置,处理1200列也毫无压力。
先回顾下你的示例数据:
# df1示例 head(df1) # V1 CHR MAPINFO Pval # 1 a 2 38067017 0.27 # 2 c 2 38070880 0.29 # 3 d 2 38073394 0.00 # 4 e 2 38073443 0.00 # 5 f 2 38073564 0.01 # df2示例 head(df2) # a b c d f # 1 -0.09 -0.08 -0.50 0.50 0.35 # 2 0.00 0.00 0.40 -0.40 -0.85 # 3 0.32 0.30 0.20 0.74 0.42 # 4 -0.41 -0.52 -0.72 -0.90 -0.96 # 5 1.30 1.30 1.10 1.10 1.20 # 6 -1.12 -1.78 -1.40 1.40 1.20
实现步骤
核心思路就是先找出两者的交集元素,再分别对两个DataFrame做筛选:
- 提取交集元素:用
intersect()函数直接拿到df1$V1和df2列名的共有项
common_items <- intersect(df1$V1, colnames(df2))
- 筛选df1:保留V1值在交集中的行
df1_filtered <- df1[df1$V1 %in% common_items, ]
- 筛选df2:保留列名在交集中的列
df2_filtered <- df2[, common_items]
处理后的结果
运行完上面的代码,你就能得到想要的结果:
# 筛选后的df1 head(df1_filtered) # V1 CHR MAPINFO Pval # 1 a 2 38067017 0.27 # 2 c 2 38070880 0.29 # 3 d 2 38073394 0.00 # 5 f 2 38073564 0.01 # 筛选后的df2 head(df2_filtered) # a c d f # 1 -0.09 -0.50 0.50 0.35 # 2 0.00 0.40 -0.40 -0.85 # 3 0.32 0.20 0.74 0.42 # 4 -0.41 -0.72 -0.90 -0.96 # 5 1.30 1.10 1.10 1.20 # 6 -1.12 -1.40 1.40 1.20
这个方法的优势在于完全用base R原生函数,没有额外依赖,而且都是向量级别的操作,处理1200列这种规模效率很高,完全不用绕转置的弯路。
内容的提问来源于stack exchange,提问作者Irma
相关产品推荐
相关产品推荐

