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

如何在R中移除数据框中仅含同一基因标签或全空的行?

问题描述

我有如下数据框:

# 创建数据框
V1 = c("gene_1", "gene_1", "", "")
V2 = c("gene_2", "gene_2", "", "")
V3 = c("gene_3", "gene_3", "gene_4", "")
V4 = c("gene_4", "gene_4", "", "")
V5 = c("gene_5", "gene_5", "gene_8", "")
V6 = c("gene_6", "gene_6", "gene_6", "gene_7")
df = as.data.frame(rbind(V1, V2, V3, V4, V5, V6))

该数据框df的内容如下:

V1     V2     V3     V4
V1 gene_1 gene_1              
V2 gene_2 gene_2              
V3 gene_3 gene_3 gene_4       
V4 gene_4 gene_4              
V5 gene_5 gene_5 gene_8       
V6 gene_6 gene_6 gene_6 gene_7

我希望移除所有仅含同一基因标签的行,得到如下结果:

V1     V2     V3     V4            
V3 gene_3 gene_3 gene_4                  
V5 gene_5 gene_5 gene_8       
V6 gene_6 gene_6 gene_6 gene_7

我查找了多个类似问题,但现有解决方案都不适用,希望得到解决方法。


解决方案

基础R实现

可以通过逐行检查非空值的唯一值数量来筛选行:

# 定义检查函数:判断行内非空值是否存在多种
check_multiple_genes <- function(row) {
  non_empty_vals <- row[row != ""]
  length(unique(non_empty_vals)) > 1
}

# 应用函数过滤数据框
filtered_df <- df[apply(df, 1, check_multiple_genes), ]

运行后filtered_df即为目标结果。

dplyr实现(更简洁)

如果你习惯用dplyr,可以这样写:

library(dplyr)

filtered_df <- df %>%
  rowwise() %>%
  # 提取非空值,判断唯一值数量是否大于1
  filter(n_distinct(c_across(everything())[c_across(everything()) != ""]) > 1) %>%
  ungroup()

逻辑说明

两种方法核心逻辑一致:

  1. 提取每行的非空值(忽略空字符串)
  2. 判断这些值的唯一值数量是否大于1:
    • 若大于1,说明该行存在不同基因标签,保留
    • 若等于1,说明该行只有一种基因标签,移除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:50:23