[R] Replacing NAs in long format

Rui Barradas ruipbarradas at sapo.pt
Sat Nov 3 19:20:10 CET 2012


Hello,

Try the following. I've called your data.frames 'dat' and 'dat2'

# First your datasets, see ?dput
dput(dat)
structure(list(idr = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), schyear = c(8L, 9L,
10L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 4L, 5L, 6L, 7L, 8L,
9L, 10L, 11L), year = c(0L, 1L, NA, NA, -1L, 0L, 1L, 2L, 3L,
4L, NA, 6L, NA, -2L, -1L, 0L, 1L, 2L, 3L, NA)), .Names = c("idr",
"schyear", "year"), class = "data.frame", row.names = c(NA, -20L
))
dput(dat2)
structure(list(idr = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), schyear = c(8L, 9L,
10L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 4L, 5L, 6L, 7L, 8L,
9L, 10L, 11L), year = c(0L, 1L, 2L, -2L, -1L, 0L, 1L, 2L, 3L,
4L, 5L, 6L, -3L, -2L, -1L, 0L, 1L, 2L, 3L, 4L)), .Names = c("idr",
"schyear", "year"), class = "data.frame", row.names = c(NA, -20L
))

# Now the code
fun <- function(x){
     for(i in which(is.na(x$year))){
         if(i == 1)
             x$year[i] <- x$year[i + 1] - 1L
         else
             x$year[i] <- x$year[i - 1] + 1L
     }
     x
}

result <- do.call(rbind, lapply(split(dat, dat$idr), fun))
all.equal(result, dat2)

Hope this helps,

Rui Barradas
Em 03-11-2012 17:14, Christopher Desjardins escreveu:
> Hi,
> I have the following data:
>
>> data[1:20,c(1,2,20)]
> idr  schyear year
> 1       8    0
> 1       9    1
> 1      10   NA
> 2       4   NA
> 2       5   -1
> 2       6    0
> 2       7    1
> 2       8    2
> 2       9    3
> 2      10    4
> 2      11   NA
> 2      12    6
> 3       4   NA
> 3       5   -2
> 3       6   -1
> 3       7    0
> 3       8    1
> 3       9    2
> 3      10    3
> 3      11   NA
>
> What I want to do is replace the NAs in the year variable with the
> following:
>
> idr  schyear year
> 1       8    0
> 1       9    1
> 1      10   2
> 2       4   -2
> 2       5   -1
> 2       6    0
> 2       7    1
> 2       8    2
> 2       9    3
> 2      10    4
> 2      11   5
> 2      12    6
> 3       4   -3
> 3       5   -2
> 3       6   -1
> 3       7    0
> 3       8    1
> 3       9    2
> 3      10    3
> 3      11   4
>
> I have no idea how to do this. What it needs to do is make sure that for
> each subject (idr) that it either adds a 1 if it is preceded by a value in
> year or subtracts a 1 if it comes before a year value.
>
> Does that make sense? I could do this in Excel but I am at a loss for how
> to do this in R. Please reply to me as well as the list if you respond.
>
> Thanks!
> Chris
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.




More information about the R-help mailing list