Подтвердить что ты не робот

Добавить отсутствующее значение в столбце со значением из строки выше

Каждую неделю я неполный набор данных для анализа. Это выглядит так:

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 для этого. Но это затрудняет автоматизацию анализа. Отныне я хотел бы сделать это в Р. Но я не знаю, как это сделать.

Спасибо за вашу помощь.

ОБНОВЛЕНИЕ ВОПРОСОВ ПОСЛЕ КОММЕНТАРИИ

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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"