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

如何简洁筛选DataFrame中Chromosome.EU与Chromosome.AM为chr02-chr05配对的行

问题描述

我有如下结构的DataFrame:

ID  Chromosome.EU  Position.EU  Chromosome.AM  Position.AM
AX-875          chr02     50241802          chr02      1773016
AX-964          chr02     51189882          chr05      2720414
AX-873          chr04     51371415          chr04      2902066
AX-962          chr06     51442510          chr02      2973445
AX-872          chr05     51531135          chr02      3067694
AX-877          chr02     51806507          chr05      3357612
AX-869          chr05     51816808          chr05      3367924

希望筛选出仅包含Chromosome.EU和Chromosome.AM为chr02与chr05双向配对的ID行,预期结果如下:

ID  Chromosome.EU  Position.EU  Chromosome.AM  Position.AM
AX-964          chr02     51189882          chr05      2720414
AX-872          chr05     51531135          chr02      3067694
AX-877          chr02     51806507          chr05      3357612

我已写出满足需求的条件语句,但语句过长,想知道是否有更简洁的写法:

df[(df$Chromosome.EU=="chr02" & df$Chromosome.AM=="chr05") | (df$Chromosome.EU=="chr05" & df$Chromosome.AM=="chr02"),]
简洁写法方案

方案1:利用interaction函数

通过将两列组合成交互项,匹配目标配对的组合,代码更简洁:

target_pairs <- c("chr02.chr05", "chr05.chr02")
df[interaction(df$Chromosome.EU, df$Chromosome.AM) %in% target_pairs, ]

方案2:利用rowSums筛选

先确保两行都属于目标染色体集合,再排除两列相同的情况,适合扩展到更多目标染色体的场景:

df[rowSums(df[, c("Chromosome.EU", "Chromosome.AM")] %in% c("chr02", "chr05")) == 2 & 
     df$Chromosome.EU != df$Chromosome.AM, ]

方案3:tidyverse风格写法

如果使用dplyr包,管道式写法更易读,也能简化代码:

library(dplyr)

# 写法一:简化条件表达式
df %>%
  filter((Chromosome.EU == "chr02" & Chromosome.AM == "chr05") | 
           (Chromosome.EU == "chr05" & Chromosome.AM == "chr02"))

# 写法二:结合interaction函数
df %>%
  filter(interaction(Chromosome.EU, Chromosome.AM) %in% c("chr02.chr05", "chr05.chr02"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:31:09