Hi Jim, Thank you so much. That does exactly what I want. Chris On Sat, Nov 3, 2012 at 1:30 PM, jim holtman <jholt...@gmail.com> 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 > <cddesjard...@gmail.com> 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]] > > > > ______________________________________________ > > R-help@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. > > > > -- > 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]] ______________________________________________ R-help@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.