2010-05-04 25 views
13

estoy tratando de reemplazar elementos de un hoja.de.datos que contengan "# N/A" con "NULO", y estoy corriendo en problemas:R: ¿Cómo reemplazar elementos de un data.frame?

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 

indices_of_NAs <- which(foo == "#N/A") 

replace(foo, indices_of_NAs, "NULL") 

error en [<-.data.frame (*tmp*, lista, el valor = "NULO"): nuevas columnas dejarán huecos después de las columnas existentes

Creo que el problema es que mi índice está tratando el data.frame como un vector, pero que la función de reemplazo lo trata de manera diferente de alguna manera, pero No estoy seguro de cuál es el problema?

Respuesta

19

NULL en realidad significa "nada", no "falta" por lo que no puede tomar el lugar de un valor real, ya que falta R usa NA.

Puede utilizar el método de reemplazo de is.na para actualizar directamente los elementos seleccionados, esto funcionará con un resultado lógico. (El uso de los índices solo funcionará con is.na, el uso directo de [invoca el acceso a la lista, que es la causa de su error).

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 
NAs <- foo == "#N/A" 

## by replace method 
is.na(foo)[NAs] <- TRUE 

## or directly 
foo[NAs] <- NA 

Pero, ya se trata de cadenas (en realidad un factor por defecto) en la columna desde la coacción forzada cuando fue creado con c(), y puede que tenga que tratar columnas individualmente. Cualquier columna numérica nunca tendrá una coincidencia en la cadena "# N/A", por ejemplo.

+0

Nunca me di cuenta de que había un "is.na <-", demasiado genial. – geoffjentry

+0

¿Qué quiere decir con "Cualquier columna numérica nunca tendrá una coincidencia en la cadena" # N/A ", por ejemplo."? ¿Cómo puedo verificar qué tipo de columna estoy mirando? – spier

+0

Buena solución. ¿Cómo se hace que las columnas se reinterpreten como numéricas después de reemplazar los valores con NA? Tengo docenas de columnas y es muy difícil decir cuáles cambiaron los valores de NA. – Dave

1

La función de reemplazo espera un vector y está suministrando un data.frame.

Realmente debería intentar usar NA y NULL en lugar de los valores de caracteres que está utilizando actualmente. De lo contrario, no podrá aprovechar todas las funciones de R para gestionar los valores perdidos.

Edición

Se podría utilizar una función de aplicación, ni que algo como esto:

foo <- data.frame(day= c(1, 3, 5, 7), od = c(0.1, NA, 0.4, 0.8)) 
idx <- which(is.na(foo), arr.ind=TRUE) 
foo[idx[1], idx[2]] <- "NULL" 

No se puede asignar un valor real NULL en este caso, debido a que tiene una longitud cero. Es importante entender la diferencia entre NA y NULL, por lo que le recomiendo que lea ?NA y ?NULL.

+0

Gracias Shane, ¿me recomienda convertir mi data.frame a un vector, realizar la función y luego convertirla de nuevo a data.frame? Usaré los formatos de datos que sugieres. – John

12

Por qué no

x$col[is.na(x$col)]<-value 

?
No tendrá que cambiar su dataframe

Cuestiones relacionadas