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