Использование R для удаления всех столбцов, сумма которых равна 0 - PullRequest
1 голос
/ 28 мая 2020

У меня есть очень большой CSV-файл, содержащий количество уникальных последовательностей ДНК, и для каждой уникальной последовательности есть столбец. Я начал с сотен образцов и сократил их до 15, которые меня волнуют, но теперь у меня есть ТЫСЯЧИ столбцов, которые не содержат ничего, кроме нулей, и это мешает моей обработке данных. Как мне go полностью удалить любой столбец, сумма которого равна нулю? Я видел здесь несколько похожих вопросов, но ни одно из этих предложений не помогло мне.

У меня 6653 столбца и 16 строк в моем фрейме данных.

Если это важно, все мои столбцы имеют супер сумасшедшие имена, длиной несколько сотен символов (AATCGGCTAA ..., et c), а имена строк - это идентификаторы образцов, которые также не полностью числовые c . Любые советы очень ценятся. Я все еще новичок в R, поэтому, пожалуйста, дайте мне знать, где мне нужно будет что-то изменить в примерах кода, если сможете! Спасибо!

Ответы [ 2 ]

5 голосов
/ 28 мая 2020

Вы можете использовать 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
1 голос
/ 28 мая 2020

добро пожаловать в SO, вот примерный подход

library(tidyverse)


mtcars %>% 
  select_if(is.numeric) %>% 
  select_if(~ sum(.x) > 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...