2012-04-10 19 views
250

Tengo un marco de datos R con 6 columnas, y quiero crear un nuevo marco de datos que solo tenga tres de las columnas. noExtracción de columnas específicas de un marco de datos

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

es una forma más compacta de hacer esto:

Suponiendo mi trama de datos es df, y quiero extraer columnas A, B y E, este es el único comando que puedo averiguar ?

Respuesta

342

Sí, la hay.

# 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")] 
+2

Que da el error 'objeto de tipo 'cierre' no es subconjunto'. –

+19

@ArenCambre: entonces su data.frame realmente no se llama 'df'. 'df' también es una función en el paquete de estadísticas. –

+4

@ArenCambre: http://2.bp.blogspot.com/-XU9PduVhq-I/Um-Y6e19jZI/AAAAAAAADfI/PrmoFQexa5M/s1600/Book+last+page.jpg –

42

Hay dos opciones obvias: Ulrich de Joshua df[,c("A","B","E")] o

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

como en

> 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 
70

Este es el papel de la función subset():

> 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 
+0

Cuando intento esto, con mis datos, aparece el error: "Error en x [j]: tipo de subíndice no válido 'lista'" Pero si c ("A", "B") no es una lista , ¿Qué es? –

+0

@Rafael_Espericueta Difícil de adivinar sin ver su código ... Pero 'c (" A "," B ")' es un vector, no una lista. –

+0

Convierte el marco de datos a la lista. –

28

Uso el dplyr paquete, si su hoja.de.datos se llama df1:

library(dplyr) 

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

Esto también se puede escribir sin la tubería %>% como:

select(df1, A, B, E) 
6

Usando de nuevo dplyr, donde DF1 es su marco de datos original:

df2 <- subset(df1, select = c(1, 2, 5)) 
+3

Esto no usa 'dplyr'. Utiliza 'base :: subconjunto', y es idéntica a [respuesta de Stephane Laurent] (https://stackoverflow.com/a/10086494/903061) excepto que utiliza números de columna en lugar de nombres de columna. – Gregor

0

[ y subconjunto no son sustituibles:

[ devuelve un vector si solo se selecciona una columna.

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")) 
) 
+0

No si configura 'drop = FALSE'. Ejemplo: 'df [, c (" a "), drop = F]' – untill

6

También puede utilizar el paquete sqldf que lleva a cabo selecciona en tramas de datos R como:

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

Esto da como la salida de una trama de datos df1 con columnas: A, B, E.

2

Por alguna razón solamente

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

trabajó para mí. Todas las sintaxis anteriores arrojaron "columnas indefinidas seleccionadas".

Cuestiones relacionadas