> 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.

______________________________________________
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.

Reply via email to