使用 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)
我有一个非常大的 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)