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

1 r bioinformatics

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

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

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

Ice*_*can 5

您可以使用 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
Run Code Online (Sandbox Code Playgroud)

但是您可能不想删除总和为 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
Run Code Online (Sandbox Code Playgroud)

所以如果你只想删除所有元素都为 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
Run Code Online (Sandbox Code Playgroud)