[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