Usuń całą kolumnę z danych.ramka w R

Czy ktoś wie jak usunąć całą kolumnę z danych.ramka w R? Na przykład, jeśli otrzymam te dane.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

I chcę usunąć drugą kolumnę.

 211
Author: user227710, 2011-06-09

5 answers

Można ustawić na 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

Jak zaznaczono w komentarzach, oto kilka innych możliwości:

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

Możesz usunąć wiele kolumn poprzez:

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

Bądź ostrożny z podzbiorem macierzy, ponieważ możesz skończyć z wektorem:

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame
 330
Author: Joshua Ulrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 11:04:22

Aby usunąć jedną lub więcej kolumn po nazwie, gdy nazwy kolumn są znane( w przeciwieństwie do określania w czasie wykonywania), podoba mi się składnia subset(). Np. dla ramki danych

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

Aby usunąć tylko a kolumnę można zrobić

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

I aby usunąć kolumny b i d można zrobić

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

Możesz usunąć wszystkie kolumny pomiędzy d i b za pomocą:

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

Jak powiedziałem powyżej, składnia ta działa tylko wtedy, gdy nazwy kolumn są znane. To nie zadziała. kiedy powiedzmy nazwy kolumn są ustalane programowo (tzn. przypisywane do zmiennej). Powtórzę to Ostrzeżenie z ?subset dokumentacji:

Ostrzeżenie:

Jest to Funkcja wygodna przeznaczona do interaktywnego użytku. Do programowania lepiej jest użyć standardowego podzbioru funkcje takie jak " [ " , a w szczególności niestandardowa ocena argument "podzbiór" może mieć nieprzewidziane konsekwencje.

 59
Author: Prasad Chalasani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 16:33:47

Zamieszczone odpowiedzi są bardzo dobre podczas pracy z data.frame S. jednak te zadania mogą być dość nieefektywne z perspektywy pamięci. W przypadku dużych danych usunięcie kolumny może zająć niezwykle dużo czasu i / lub nie powiedzie się z powodu błędów out of memory. Pakiet data.table pomaga rozwiązać ten problem za pomocą operatora :=:

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

Powinienem złożyć większy przykład, aby pokazać różnice. Będę aktualizować tę odpowiedź w pewnym momencie z tym.

 19
Author: Chase,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 16:40:42

(dla kompletności) jeśli chcesz usunąć kolumny według nazwy, możesz to zrobić:

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]

W Tym drop = F zapewnia, że wynik będzie nadal data.frame, nawet jeśli pozostanie tylko jedna kolumna.

 15
Author: ceiling cat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-01 08:36:21

Dzięki temu możesz usunąć column i przechowywać variable w innym variable.

df = subset(data, select = -c(genome) )
 2
Author: Nirali Khoda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-04 05:38:07