Удалите весь столбец из data.frame в R

Кто-нибудь знает, как удалить весь столбец из data.frame в R? Например, если мне дан этот файл data.frame:

> head(data)
   chr       genome region
1 chr1 hg19_refGene    CDS
2 chr1 hg19_refGene   exon
3 chr1 hg19_refGene    CDS
4 chr1 hg19_refGene   exon
5 chr1 hg19_refGene    CDS
6 chr1 hg19_refGene   exon

и я хочу удалить второй столбец.

Ответ 1

Вы можете установить его на NULL.

> Data$genome <- NULL
> head(Data)
   chr region
1 chr1    CDS
2 chr1   exon
3 chr1    CDS
4 chr1   exon
5 chr1    CDS
6 chr1   exon

Как отмечалось в комментариях, вот некоторые другие возможности:

Data[2] <- NULL    # Wojciech Sobala
Data[[2]] <- NULL  # same as above
Data <- Data[,-2]  # Ian Fellows
Data <- Data[-2]   # same as above

Вы можете удалить несколько столбцов с помощью:

Data[1:2] <- list(NULL)  # Marek
Data[1:2] <- NULL        # does not work!

Будьте осторожны с подмножеством матриц, хотя, как вы можете в конечном итоге с вектором:

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame

Ответ 2

Чтобы удалить один или несколько столбцов по имени, когда имена столбцов известны (в отличие от определения во время выполнения), мне нравится синтаксис subset(). Например. для кадра данных

df <- data.frame(a=1:3, d=2:4, c=3:5, b=4:6)

чтобы удалить только столбец a, который вы могли бы сделать

Data <- subset( Data, select = -a )

и удалить столбцы b и d, которые вы могли бы сделать

Data <- subset( Data, select = -c(d, b ) )

Вы можете удалить все столбцы между d и b с помощью

Data <- subset( Data, select = -c( d : b )

Как я уже говорил выше, этот синтаксис работает только тогда, когда известны имена столбцов. Он не будет работать, если говорят, что имена столбцов определяются программно (т.е. назначаются переменной). Я воспроизведу это предупреждение из документации ?subset:

Внимание:

Это функция удобства, предназначенная для интерактивного использования. Для программирования лучше использовать стандартное подмножество функции, такие как '[', и, в частности, нестандартная оценка аргумента "подмножество" может иметь непредвиденные последствия.

Ответ 3

Отправленные ответы очень хороши при работе с data.frame s. Однако эти задачи могут быть довольно неэффективными с точки зрения памяти. При больших данных удаление столбца может занять необычно большое количество времени и/или сбой из-за ошибок out of memory. Пакет data.table помогает решить эту проблему с помощью оператора :=:

library(data.table)
> dt <- data.table(a = 1, b = 1, c = 1)
> dt[,a:=NULL]
     b c
[1,] 1 1

Я должен собрать более большой пример, чтобы показать различия. В какой-то момент я обновлю этот ответ.

Ответ 4

(Для полноты) Если вы хотите удалить столбцы по имени, вы можете сделать это:

cols.dont.want <- "genome"
cols.dont.want <- c("genome", "region") # if you want to remove multiple columns

data <- data[, ! names(data) %in% cols.dont.want, drop = F]

Включение drop = F гарантирует, что результат все равно будет data.frame, даже если останется только один столбец.

Ответ 5

С помощью этого вы можете удалить column и сохранить variable в другой variable.

df = subset(data, select = -c(genome) )