Tengo una serie de columnas que me gustaría eliminar de un marco de datos. Sé que podemos eliminarlas individualmente usando algo como:
df$x <- NULL
Pero esperaba poder hacerlo con menos comandos.
Además, sé que podría soltar columnas utilizando la indexación de enteros así:
df <- df[ -c(1, 3:6, 12) ]
Pero me preocupa que la posición relativa de mis variables pueda cambiar.
Teniendo en cuenta lo potente que es R, pensé que podría haber una forma mejor que soltar cada columna una por una.
Puede utilizar una simple lista de nombres:
DF <- data.frame(
x=1:10,
y=10:1,
z=rep(5,10),
a=11:20
)
drops <- c("x","z")
DF[ , !(names(DF) %in% drops)]
O, alternativamente, puede hacer una lista de los que debe conservar y referirse a ellos por su nombre :
keeps <- c("y", "a")
DF[keeps]
EDITAR :
Para aquellos que aún no conocen el argumento drop
de la función de indexación, si quieres mantener una columna como un marco de datos, lo haces:
keeps <- "y"
DF[ , keeps, drop = FALSE]
drop=TRUE
(o no mencionarlo) eliminará las dimensiones innecesarias, y por lo tanto devolverá un vector con los valores de la columna y
.
También existe el comando subset
, útil si sabes qué columnas quieres:
df <- data.frame(a = 1:10, b = 2:11, c = 3:12)
df <- subset(df, select = c(a, c))
ACTUALIZADO tras el comentario de @hadley: Para suprimir las columnas a,c podrías hacer:
df <- subset(df, select = -c(a, c))