2012-03-01 2 views
12

Каждую неделю я неполный набор данных для анализа. Это выглядит так:Добавить отсутствующее значение в столбце со значением из строки выше

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

Некоторые значения var1 отсутствуют. Набор данных должен выглядеть следующим образом:

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

В настоящее время для этого используется макрос Excel. Но это затрудняет автоматизацию анализа. Отныне я хотел бы сделать это в Р. Но я понятия не имею, как это сделать.

Благодарим за помощь.

ВОПРОС UPDATE ПОСЛЕ К.П

var2 не имеет отношения к моему вопросу. Единственное, что я пытаюсь сделать. Получите от df1 до df2.

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

Я не понимаю, шаблон, используемый для замены отсутствующих значений с. Вы хотите заменить первый набор пробелов «a» до «b», а затем заменить пробелы «b» до «c» и т. Д. ... – John

+0

Извините за путаницу. var2 вообще не имеет отношения к вопросу. Я уточню свой вопрос. – jeroen81

+2

Добавлен пакет tidyr v0.3.0 'fill()'. Это то, чего я хотел. – jeroen81

ответ

16

Вот один из способов сделать это путем использования кодирования длин серий (rle) и обратный 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) 

Результаты:

df1 

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

Спасибо, это ответ, который я искал. – jeroen81

+0

Очень полезно, спасибо Andrie! Я адаптировал это для своих нужд и создал монстра (возможно, опасного), но для записи: https://pastebin.com/82kvNp1D – PatrickT

10

Вот более простой способ:

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

+1 Должен. Получить. Знакомые. С. Зоопарк. – Andrie

2

Вот еще один способ, который немного короче и не принуждать к характеру:

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

Результаты:

# 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 Ницца .... – Andrie

Смежные вопросы