如何简洁筛选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
相关产品推荐
相关产品推荐

