Кто-нибудь знает, как удалить весь столбец из 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) )