3

I want to auto-populate a variable in R with a value until the next value is reached in the column.

I want to turn this:

    X  Y       
    a  1
       1
       1
    b  1
       1
       1
    c  1 

Into:

    X  Y       
    a  1
    a  1
    a  1
    b  1
    b  1
    b  1
    c  1 
  • 1
    Possible duplicate of [Replacing NAs with latest non-NA value](http://stackoverflow.com/questions/7735647/replacing-nas-with-latest-non-na-value) – mtoto Mar 13 '17 at 17:41
  • 1
    Somehow your second table is longer than the first. – Frank Mar 13 '17 at 17:49

2 Answers2

5

You can do this with tidyr::fill

library(tidyr)
mydf <- data.frame(X = c('a', NA, NA, 'b', NA, NA, 'c'), Y =rep(1,7))
mydf %>% fill(X)

  X Y
1 a 1
2 a 1
3 a 1
4 b 1
5 b 1
6 b 1
7 c 1
A Toll
  • 647
  • 7
  • 15
3

We could try na.locf from zoo:

df <- read.csv(text='X,  Y       
             a, 1
              , 1
              , 1
             b, 1
              , 1
              , 1
             c, 1', header=TRUE, stringsAsFactors=FALSE)

df # input
#                   X Y
#1                  a 1
#2                    1
#3                    1
#4                  b 1
#5                    1
#6                    1
#7                  c 1

library(zoo)
df$X <- gsub('\\s+', '', df$X)  # replace multiple spaces by blanks
df$X[df$X == ''] <- NA  # replace blanks by NAs
df$X <- na.locf(df$X)
df
#  X Y
#1 a 1
#2 a 1
#3 a 1
#4 b 1
#5 b 1
#6 b 1
#7 c 1
Sandipan Dey
  • 21,482
  • 2
  • 51
  • 63