首页 > 解决方案 > 根据总和选择列

问题描述

例如,我有一个包含许多基因列和行的数据框

id  treatment time gene1 gene2 gene3 …
1      A       1     2     0    2    …
2      A       2     0     0    3    …
3      A       3     0     0    4    …
4      B       4     0     0    0    …
5      B       5     0     0    2    …
6      B       3     1     0    1    …
7      C       5     0     0    2    …

我想保留所有前几列(示例数据为三,但实际数据中有很多列)和列总和> 0的基因列。

对于我的问题,我将不胜感激。非常感谢!

标签: r

解决方案


我不完全确定是否要保留条目总和 > 0 的行或列。

如果是前者,您可以rowSums像这样使用

df[rowSums(df[, grep("gene", names(df))]) > 0, ]
#id treatment time gene1 gene2 gene3
#1  1         A    1     2     0     2
#2  2         A    2     0     0     3
#3  3         A    3     0     0     4
#5  5         B    5     0     0     2
#6  6         B    3     1     0     1
#7  7         C    5     0     0     2

或者只保留条目总和 > 0 的列,您可以使用colSums

df[, names(df) %in% c(
    names(df)[grep("gene", names(df), invert = T)],
    names(which(colSums(df[, grep("gene", names(df))]) > 0)))]
#  id treatment time gene1 gene3
#1  1         A    1     2     2
#2  2         A    2     0     3
#3  3         A    3     0     4
#4  4         B    4     0     0
#5  5         B    5     0     2
#6  6         B    3     1     1
#7  7         C    5     0     2

这假设所有基因列都包含单词"gene"(并且所有非基因列都不包含单词"gene")。

或者更简洁(感谢@Shree),

df[, c(rep(T, 3), colSums(df[, -c(1:3)]) > 0)]

假设前 3 列是非基因列(其余列都是基因列)。


样本数据

df <- read.table(text =
    "id  treatment   time    gene1   gene2   gene3
1   A   1   2   0   2
2   A   2   0   0   3
3   A   3   0   0   4
4   B   4   0   0   0
5   B   5   0   0   2
6   B   3   1   0   1
7   C   5   0   0   2", header = T)

推荐阅读