2012-03-01 17 views
12

Cada semana, un conjunto de datos incompletos para un análisis. Parece que:Agregue el valor que falta en la columna con el valor de la fila de arriba

df1 <- data.frame(var1 = c("a","","","b",""), 
      var2 = c("x","y","z","x","z")) 

Faltan algunos valores var1. El conjunto de datos debe terminar pareciéndose a esto:

df2 <- data.frame(var1 = c("a","a","a","b","b"), 
      var2 = c("x","y","z","x","z")) 

Actualmente uso de una macro de Excel para hacer esto. Pero esto hace que sea más difícil automatizar el análisis. A partir de ahora me gustaría hacer esto en R. Pero no tengo idea de cómo hacer esto.

Gracias por su ayuda.

PREGUNTA ACTUALIZACIÓN Después del comentario

var2 no es relevante para mi pregunta. Lo único que intento es. Obtener de df1 a df2.

df1 <- data.frame(var1 = c("a","","","b","")) 
df2 <- data.frame(var1 = c("a","a","a","b","b")) 
+0

que no entiendo el patrón que está utilizando para reemplazar los valores perdidos con. ¿Desea reemplazar el primer conjunto de espacios en blanco con 'a' hasta 'b' y luego reemplazar los espacios en blanco con 'b' hasta 'c' y así sucesivamente ... – John

+0

Disculpe la confusión. var2 no es relevante para ninguna pregunta en absoluto. Actualizaré mi pregunta. – jeroen81

+2

I se agrega el paquete tidyr v0.3.0 'fill()'. Esto es exactamente lo que yo quería. – jeroen81

Respuesta

16

Aquí es una forma de hacerlo es mediante el uso de RLE (rle) y su inversa rle.inverse:

fillTheBlanks <- function(x, missing=""){ 
    rle <- rle(as.character(x)) 
    empty <- which(rle$value==missing) 
    rle$values[empty] <- rle$value[empty-1] 
    inverse.rle(rle) 
} 

df1$var1 <- fillTheBlanks(df1$var1) 

Los resultados:

df1 

    var1 var2 
1 a x 
2 a y 
3 a z 
4 b x 
5 b z 
+0

Gracias, esta es la respuesta que estaba buscando. – jeroen81

+0

Muy útil, gracias Andrie! Lo adapté a mis necesidades y produje un monstruo (posiblemente peligroso), pero para el registro: https://pastebin.com/82kvNp1D – PatrickT

10

Aquí es una manera más simple:

library(zoo) 
df1$var1[df1$var1 == ""] <- NA 
df1$var1 <- na.locf(df1$var1) 
+0

+1 Must. Obtener. Familiar. Con. Zoo. – Andrie

2

Aquí es otra forma que es ligeramente más corto y no obliga al personaje:

Fill <- function(x,missing="") 
{ 
    Log <- x != missing 
    y <- x[Log] 
    y[cumsum(Log)] 
} 

Resultados:

# For factor: 
Fill(df1$var1) 
[1] a a a b b 
Levels: a b 

# For character: 
Fill(as.character(df1$var1)) 
[1] "a" "a" "a" "b" "b" 
+0

+1 Agradable ... – Andrie

Cuestiones relacionadas