2012-03-01 21 views
12

Co tydzień mam niepełny zestaw danych do analizy. Wygląda to następująco:Dodaj brakującą wartość w kolumnie z wartością z wiersza powyżej

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

Brak niektórych wartości zmiennych var1. Zbiór danych powinien wyglądać tak:

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

Obecnie używam makra Excela, aby to zrobić. Ale to utrudnia automatyzację analizy. Odtąd chciałbym to zrobić w R. Ale nie mam pojęcia, jak to zrobić.

Dzięki za pomoc.

PYTANIE aktualizacja po KOMENTARZ

VAR2 nie jest istotne dla mojego pytania. Jedyne, co próbuję, to. Uzyskaj od df1 do df2.

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

nie rozumiem wzoru używanego do zastąpienia brakujących wartości z. Czy chcesz zamienić pierwszy zestaw spacji na "a" do "b", a następnie zastąp puste pola "b" do "c" itd. – John

+0

Przepraszamy za zamieszanie. var2 nie ma znaczenia dla pytania. Zaktualizuję moje pytanie. – jeroen81

+2

Dodałem pakiet tidyr v0.3.0 'fill()'. Dokładnie to chciałem. – jeroen81

Odpowiedz

16

Oto jeden sposób to zrobić wykorzystując kodowanie run-length (rle) i jego odwrotność 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) 

Wyniki:

df1 

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

Dzięki, to jest odpowiedź, której szukałem. – jeroen81

+0

Bardzo przydatne, dzięki Andrie! Zaadaptowałem to do moich potrzeb i wyprodukowałem potwora (prawdopodobnie niebezpiecznego), ale dla przypomnienia: https://pastebin.com/82kvNp1D – PatrickT

10

Oto prostszy sposób:

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

+1 Wymag. Otrzymać. Znajomy. Z. Ogród zoologiczny. – Andrie

2

Oto kolejny sposób, który jest nieco krótszy i nie zmuszać do znaku:

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

Wyniki:

# 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 Niezły .... – Andrie

Powiązane problemy