使用 R 删除总和为 0 的所有列

Using R to remove all columns that sum to 0

我有一个非常大的 CSV 文件,其中包含独特 DNA 序列的计数,每个独特序列都有一列。我从数百个样本开始,然后将其减少到我关心的 15 个,但现在我有成千上万的列,其中只包含零,这让我的数据处理变得混乱。我如何去完全删除总和为零的任何列?我在这里看到了一些类似的问题,但是 none 这些建议对我有用。

我的数据框中有 6653 列和 16 行。

如果重要的话,我的专栏都有超级疯狂的名字,大约有几百个字符长(AATCGGCTAA...等),行名是样本 ID,它们也不完全是数字。非常感谢任何提示。我还是 R 的新手,所以如果可以的话,请让我知道我需要在代码示例中更改哪些内容!谢谢!

您可以使用colSums

set.seed(10)
df <- as.data.frame(matrix(sample(0:1, 50, replace = TRUE, prob = c(.8, .2)), 
                           5, 10))

df
#  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1  0  0  0  0  1  0  0  0  0   0
# 2  0  0  0  0  0  1  0  1  0   0
# 3  0  0  0  0  0  0  0  1  0   0
# 4  0  0  0  0  0  0  1  0  0   0
# 5  0  0  0  1  0  0  0  0  0   1

df[colSums(df) != 0]
#   V4 V5 V6 V7 V8 V10
# 1  0  1  0  0  0   0
# 2  0  0  1  0  1   0
# 3  0  0  0  0  1   0
# 4  0  0  0  1  0   0
# 5  1  0  0  0  0   1

但您可能不想删除所有总和为 0 的列,因为即使并非所有元素都为 0,这也可能是正确的。以下面数据框中的 V4 为例。

df$V4[1] <- -1
df
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1  0  0  0 -1  1  0  0  0  0   0
# 2  0  0  0  0  0  1  0  1  0   0
# 3  0  0  0  0  0  0  0  1  0   0
# 4  0  0  0  0  0  0  1  0  0   0
# 5  0  0  0  1  0  0  0  0  0   1

所以如果你只想删除所有元素都为 0 的列,你可以这样做

df[colSums(df == 0) < nrow(df)]
#   V4 V5 V6 V7 V8 V10
# 1 -1  1  0  0  0   0
# 2  0  0  1  0  1   0
# 3  0  0  0  0  1   0
# 4  0  0  0  1  0   0
# 5  1  0  0  0  0   1

欢迎来到 SO 这里是一个 tidyverse 方法

library(tidyverse)


mtcars %>% 
  select_if(is.numeric) %>% 
  select_if(~ sum(.x) > 0)