Entfernen Sie eine ganze Spalte aus einem data.frame in R.

267

Weiß jemand, wie man eine ganze Spalte aus einem data.frame in R entfernt? Zum Beispiel, wenn ich diesen data.frame bekomme:

> 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

und ich möchte die 2. Spalte entfernen.

Nanami
quelle
1
Mögliches Duplikat von Drop-Spalten im R-
Datenrahmen

Antworten:

414

Sie können es auf einstellen 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

Wie in den Kommentaren erwähnt, gibt es hier einige andere Möglichkeiten:

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

Sie können mehrere Spalten entfernen über:

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

Seien Sie jedoch vorsichtig mit der Matrix-Teilmenge, da Sie am Ende einen Vektor erhalten können:

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame
Joshua Ulrich
quelle
48
oder Sie können verwenden: Daten <- Daten [, - 2]
Ian Fellows
2
Mit dem Komma können Sie auch das Argument "drop" steuern. Wenn FALSE bedeutet, dass der data.frame ein data.frame bleibt, wenn das Ergebnis nur aus einer Spalte besteht - ohne das Komma erhalten Sie immer einen data.frame, wenn mehrere Spalten vorhanden sind links oder nur ein Tropfen wird für die [-2] -Extraktion ignoriert
-Extraktion mdsumner
3
@mdsumner Data[-2]braucht nicht dropArgument weil es immer wieder zurückkehrt data.frameaus data.frame. Und ich denke, dies ist ein viel besserer Weg, um Spalten (und nur Spalten) zu lokalisieren data.frame(und es ist schneller). Überprüfen Sie: cars[-1](eine Spalte data.frame) oder besser cars[-(1:2)]: data frame with 0 columns and 50 rows.
Marek
1
Sie können auch Daten [2] <- NULL
Wojciech Sobala schreiben
11
Kleiner Tipp: Wenn mehrere Spalten entfernt werden müssen Data[c(1,2)]<-list(NULL).
Marek
69

Um eine oder mehrere Spalten nach Namen zu entfernen, wenn die Spaltennamen bekannt sind (anstatt zur Laufzeit festgelegt zu werden), gefällt mir die subset()Syntax. ZB für den Datenrahmen

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

um nur die aSpalte zu entfernen, die Sie tun könnten

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

und zu entfernen b und dSpalten , könnten Sie tun

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

Sie können alle Spalten zwischen entfernen d und bmit :

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

Wie oben erwähnt, funktioniert diese Syntax nur, wenn die Spaltennamen bekannt sind. Es funktioniert nicht, wenn beispielsweise die Spaltennamen programmgesteuert bestimmt werden (dh einer Variablen zugewiesen werden). Ich werde diese Warnung aus der ?subsetDokumentation reproduzieren :

Warnung:

Dies ist eine Komfortfunktion, die für die interaktive Verwendung vorgesehen ist. Für die Programmierung ist es besser, die Standard-Teilmengenfunktionen wie '[' zu verwenden, und insbesondere die nicht standardmäßige Bewertung des Arguments 'Teilmenge' kann unerwartete Konsequenzen haben.

Prasad Chalasani
quelle
26

(Der Vollständigkeit halber) Wenn Sie Spalten nach Namen entfernen möchten, können Sie dies tun:

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]

Durch das Einschließen wird drop = Fsichergestellt, dass das Ergebnis auch dann noch gleich data.framebleibt, wenn nur eine Spalte übrig bleibt.

Decke Katze
quelle
22

Die geposteten Antworten sind sehr gut, wenn Sie mit data.frames arbeiten. Diese Aufgaben können jedoch aus Speichersicht ziemlich ineffizient sein. Bei großen Datenmengen kann das Entfernen einer Spalte ungewöhnlich lange dauern und / oder aufgrund von out of memoryFehlern fehlschlagen . Das Paket data.tablehilft, dieses Problem mit dem :=Betreiber zu lösen :

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

Ich sollte ein größeres Beispiel zusammenstellen, um die Unterschiede zu zeigen. Ich werde diese Antwort irgendwann damit aktualisieren.

Verfolgungsjagd
quelle
3
Die data.table::setFunktion kann auf data.frames verwendet werden, um eine Spalte sofort zu entfernen oder zu ändern, ohne Kopien zu erstellen . Siehe hier
GSee
8

Es gibt verschiedene Optionen zum Entfernen einer oder mehrerer Spalten mit dplyr::select()und einige Hilfsfunktionen. Die Hilfsfunktionen können nützlich sein, da bei einigen nicht alle zu löschenden Spalten benannt werden müssen. Beachten Sie, dass Sie zum Löschen von Spalten mit select()einem führenden -Zeichen die Negativnamen negieren müssen.

Verwenden der dplyr::starwarsBeispieldaten für eine Vielzahl von Spaltennamen:

library(dplyr)

starwars %>% 
  select(-height) %>%                  # a specific column name
  select(-one_of('mass', 'films')) %>% # any columns named in one_of()
  select(-(name:hair_color)) %>%       # the range of columns from 'name' to 'hair_color'
  select(-contains('color')) %>%       # any column name that contains 'color'
  select(-starts_with('bi')) %>%       # any column name that starts with 'bi'
  select(-ends_with('er')) %>%         # any column name that ends with 'er'
  select(-matches('^v.+s$')) %>%       # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%          # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species
  <chr>     <chr>  
1 Tatooine  Human  
2 Tatooine  Droid 

Sie können auch nach Spaltennummer suchen:

starwars %>% 
  select(-2, -(4:10)) # column 2 and columns 4 through 10
sbha
quelle
Gute Antwort. Haben Sie eine Idee, wie Sie eine Spalte löschen können, die einen bestimmten Wert in einer ihrer Zeilen enthält (nicht in ihrem Spaltennamen, wie Sie oben vorgeschlagen haben)?
Laura K
df [, - which (sapply (df, function (x) any (x == a))]], wobei df Ihr Datenrahmen und a Ihr spezifischer Wert ist, z. B.: mtcars [, - which (sapply (mtcars, Funktion (x) any (x == 4)))]
Nanami
7

Mit diesem können Sie das entfernen columnund variablein einem anderen speichern variable.

df = subset(data, select = -c(genome) )
Nirali Khoda
quelle