如何移除仅在单个样本ID中有值的DataFrame列?
移除仅单个样本有值的化合物列
问题背景
我有一个存储样本ID与对应化合物值的DataFrame,其中存在大量仅在单个样本ID中有非零值的列。需要移除这类列,保留至少在2个样本ID中存在非零化合物值的列。
模拟数据
df1 <- data.frame(ID = c("A","B","C","D","E","F","G","H","I"), Cmpd_1 = c(5.7,0,0,0,2.5,2.1,0,6.2,1.5), Cmpd_2 = c(0,0,1,0,2.8,0,0,0,0), Cmpd_3 = c(0,0,3.5,0,0,0,0,0,0))
解决方案
方法1:基础R实现
计算每列(排除ID列)的非零值数量,筛选出数量≥2的列,再保留ID列和这些列:
# 计算各化合物列的非零值数量 non_zero_counts <- colSums(df1[, -1] != 0) # 筛选出符合条件的列(非零数≥2),并保留ID列 filtered_df <- df1[, c("ID", names(non_zero_counts)[non_zero_counts >= 2])]
方法2:dplyr包实现
如果习惯用tidyverse风格,可以用dplyr::select结合where函数:
library(dplyr) filtered_df <- df1 %>% select(ID, where(~ sum(. != 0) >= 2))
输出结果
运行上述代码后,得到的结果如下:
ID Cmpd_1 Cmpd_2 A 5.7 0.0 B 0.0 0.0 C 0.0 1.0 D 0.0 0.0 E 2.5 2.8 F 2.1 0.0 G 0.0 0.0 H 6.2 0.0 I 1.5 0.0
内容的提问来源于stack exchange,提问作者millie0725
相关产品推荐
相关产品推荐

