Estrazione di colonne specifiche da un frame di dati


366

Ho un frame di dati R con 6 colonne e desidero creare un nuovo frame di dati con solo tre colonne.

Supponendo che il mio telaio dei dati è df, e voglio colonne estratto A, Be E, questo è l'unico comando riesco a capire:

 data.frame(df$A,df$B,df$E)

Esiste un modo più compatto di farlo?

Risposte:


157

Utilizzando il pacchetto dplyr , se il tuo data.frame è chiamato df1:

library(dplyr)

df1 %>%
  select(A, B, E)

Questo può anche essere scritto senza la %>%pipe come:

select(df1, A, B, E)

2
Data la considerevole evoluzione di Tidyverse da quando ho pubblicato la mia domanda, ho cambiato la risposta.
Aren Cambre,

4
Dato il furioso tasso di cambiamento nell'ordine, vorrei mettere in guardia dall'utilizzare questo schema. Questo è in aggiunta alla mia forte preferenza contro il trattamento dei nomi di colonna come se fossero nomi di oggetti durante la scrittura di codice per funzioni, pacchetti o applicazioni.
Joshua Ulrich,

1
Sono passati più di quattro anni da quando è stata inviata questa risposta e il modello non è cambiato. Le espressioni tratteggiate possono essere piuttosto intuitive, motivo per cui sono attraenti.
Aren Cambre,

come posso eseguire un ulteriore comando su questo sottoinsieme? Ad esempio, voglio calcolare rowMean: "df1%>% rowMeans (select (A, B, E))" non funziona.
Ben

Faresti concatenare una pipeline come: df1 %>% select(A, B, E) %>% rowMeans(.). Vedere la documentazione per la %>%pipe digitando?magrittr::`%>%`
Sam Firke

448

È possibile eseguire il sottoinsieme utilizzando un vettore di nomi di colonna. Preferisco fortemente questo approccio rispetto a quelli che trattano i nomi delle colonne come se fossero nomi di oggetti (ad esempio subset()), specialmente durante la programmazione in funzioni, pacchetti o applicazioni.

# data for reproducible example
# (and to avoid confusion from trying to subset `stats::df`)
df <- setNames(data.frame(as.list(1:5)), LETTERS[1:5])
# subset
df[,c("A","B","E")]

4
Questo dà l'errore object of type 'closure' is not subsettable.
Aren Cambre,

24
@ArenCambre: allora il tuo data.frame non ha davvero un nome df. dfè anche una funzione nel pacchetto delle statistiche.
Joshua Ulrich,


2
@Cina: perché -"A"è un errore di sintassi. E ?Extractdice: " , può anche essere numeri interi negativi, indicando elementi / fette di lasciare fuori della selezione." ij...
Joshua Ulrich,

7
C'è un problema con questa sintassi, perché se si estrae una sola colonna R, restituisce un vettore al posto di un dataframe e questo potrebbe essere indesiderato: > df[,c("A")] [1] 1. L'uso subsetnon presenta questo svantaggio.
David Dorchies,

101

Questo è il ruolo della subset()funzione:

> dat <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> subset(dat, select=c("A", "B"))
  A B
1 1 3
2 2 4

Quando provo questo, con i miei dati, ottengo l'errore: "Errore in x [j]: tipo di elenco" elenco "non valido. Ma se c (" A "," B ") non è un elenco, cos'è? ?
Rafael_Espericueta,

@Rafael_Espericueta Difficile da indovinare senza visualizzare il tuo codice ... Ma c("A", "B")è un vettore, non un elenco.
Stéphane Laurent,

Converte il frame di dati in elenco.
Suat Atan PhD,

78

Ci sono due scelte ovvie: Joshua Ulrich df[,c("A","B","E")]o

df[,c(1,2,5)]

come in

> df <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> df
  A B C D E F
1 1 3 5 7 8 9
2 2 4 6 7 8 9
> df[,c(1,2,5)]
  A B E
1 1 3 8
2 2 4 8
> df[,c("A","B","E")]
  A B E
1 1 3 8
2 2 4 8

16

Per qualche motivo

df[, (names(df) %in% c("A","B","E"))]

ha funzionato per me. Tutte le sintassi sopra riportate hanno prodotto "colonne non definite selezionate".



14

È inoltre possibile utilizzare il sqldfpacchetto che esegue le selezioni sui frame di dati R come:

df1 <- sqldf("select A, B, E from df")

Questo da come output un frame di dati df1con colonne: A, B, E.



1
df<- dplyr::select ( df,A,B,C)

Inoltre, puoi assegnare un nome diverso ai dati appena creati

data<- dplyr::select ( df,A,B,C)

0

[ e sottoinsieme non sono sostituibili:

[ restituisce un vettore se è selezionata una sola colonna.

df = data.frame(a="a",b="b")    

identical(
  df[,c("a")], 
  subset(df,select="a")
) 

identical(
  df[,c("a","b")],  
  subset(df,select=c("a","b"))
)

4
Non se hai impostato drop=FALSE. Esempio:df[,c("a"),drop=F]
fino al
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.