Hi Jim,
Thank you so much. That does exactly what I want.
Chris
On Sat, Nov 3, 2012 at 1:30 PM, jim holtman <[email protected]> wrote:
> > x <- read.table(text = "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", header = TRUE)
> > # you did not specify if there might be multiple contiguous NAs,
> > # so there are a lot of checks to be made
> > x.l <- lapply(split(x, x$idr), function(.idr){
> + # check for all NAs -- just return indeterminate state
> + if (sum(is.na(.idr$year)) == nrow(.idr)) return(.idr)
> + # repeat until all NAs have been fixed; takes care of contiguous ones
> + while (any(is.na(.idr$year))){
> + # find all the NAs
> + for (i in which(is.na(.idr$year))){
> + if ((i == 1L) && (!is.na(.idr$year[i + 1L]))){
> + .idr$year[i] <- .idr$year[i + 1L] - 1
> + } else if ((i > 1L) && (!is.na(.idr$year[i - 1L]))){
> + .idr$year[i] <- .idr$year[i - 1L] + 1
> + } else if ((i < nrow(.idr)) && (!is.na(.idr$year[i + 1L]))){
> + .idr$year[i] <- .idr$year[i + 1L] -1
> + }
> + }
> + }
> + return(.idr)
> + })
> > do.call(rbind, x.l)
> idr schyear year
> 1.1 1 8 0
> 1.2 1 9 1
> 1.3 1 10 2
> 2.4 2 4 -2
> 2.5 2 5 -1
> 2.6 2 6 0
> 2.7 2 7 1
> 2.8 2 8 2
> 2.9 2 9 3
> 2.10 2 10 4
> 2.11 2 11 5
> 2.12 2 12 6
> 3.13 3 4 -3
> 3.14 3 5 -2
> 3.15 3 6 -1
> 3.16 3 7 0
> 3.17 3 8 1
> 3.18 3 9 2
> 3.19 3 10 3
> 3.20 3 11 4
> >
> >
>
>
> On Sat, Nov 3, 2012 at 1:14 PM, Christopher Desjardins
> <[email protected]> wrote:
> > 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]]
> >
> > ______________________________________________
> > [email protected] 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.
>
>
>
> --
> Jim Holtman
> Data Munger Guru
>
> What is the problem that you are trying to solve?
> Tell me what you want to do, not how you want to do it.
>
[[alternative HTML version deleted]]
______________________________________________
[email protected] 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.