2012-02-03 18 views
39

estoy trabajando en un gran conjunto de datos, con algunas filas con AN y otros con espacios en blanco:eliminar filas con valores en blanco en una columna en particular

df <- data.frame(ID = c(1:7),         
     home_pc = c("","CB4 2DT", "NE5 7TH", "BY5 8IB", "DH4 6PB","MP9 7GH","KN4 5GH"),    
     start_pc = c(NA,"Home", "FC5 7YH","Home", "CB3 5TH", "BV6 5PB",NA),    
     end_pc = c(NA,"CB5 4FG","Home","","Home","",NA)) 

¿Cómo se quita la AN y los espacios en blanco de una sola vez (en las columnas start_pc y end_pc)? en el pasado he utilizado:

df<- df[-which(is.na(df$start_pc)), ] 

... para eliminar las AN - ¿Existe un comando similar para eliminar los espacios en blanco?

Respuesta

53
df[!(is.na(df$start_pc) | df$start_pc==""), ] 
+2

¿Podría explicar cómo funciona? – chiffa

+4

'|' es un or-operador y '!' Se invierte. Por lo tanto, el comando muestra todas las filas, que son * no * b) NA o b) igual a "". – MERose

20

Es la misma construcción - simplemente para probar las cadenas vacías en lugar de NA:

Prueba esto:

df <- df[-which(df$start_pc == ""), ] 

De hecho, mirando a su código, no es necesario el which, pero el uso de la negación en su lugar, por lo que puede simplificar a:

df <- df[!(df$start_pc == ""), ] 
df <- df[!is.na(df$start_pc), ] 

Y, por supuesto, se pueden combinar estas dos declaraciones de la siguiente manera:

df <- df[!(df$start_pc == "" | is.na(df$start_pc)), ] 

Y simplificarlo aún más con with:

df <- with(df, df[!(start_pc == "" | is.na(start_pc)), ]) 

También puede comprobar la longitud no nula cadena usando nzchar.

df <- with(df, df[!(nzchar(start_pc) | is.na(start_pc)), ]) 

de responsabilidad: No he probado ninguna de este código. Por favor, avíseme si hay errores de sintaxis en cualquier lugar

+1

@richiecotton Gracias por la edición. 'nzchar' es una forma sencilla de probar con una longitud distinta de cero, y no lo sabía. – Andrie

+0

¡ninguna de estas soluciones funciona en mi caso! 'df <-structure (list (vars = structure (1: 5, .Label = c (" a "," b "," v ", " d "," e "," s "," ds ") , class = "factor"), '1' = c (NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), '2' = c (NA, 0.9, NA, NA, NA), '3' = c (NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), .Names = c ("vars", "1", "2", "3"), row.names = c (NA, 5L), clase = "datos .frame ")' –

2

Un enfoque fácil sería hacer todas las celdas en blanco NA y solo guardar casos completos. También puede buscar ejemplos de na.omit. Es un tema ampliamente discutido.

df [df == ""] < -NA

df < -df [complete.cases (df),]

1

hice algo como esto para eliminar las filas con espacios en blanco en una variable: df < - subconjunto (df, VAR! = "")

+1

¡Bienvenido a Stack Overflow!Si bien esto podría responder teóricamente a la pregunta, [sería preferible] (// meta.stackoverflow.com/q/8259) incluir aquí las partes esenciales de la respuesta y proporcionar el enlace de referencia. – manetsus

Cuestiones relacionadas