如何使用R或SAS对其进行转换

时间:2014-07-28 15:49:30

标签: r sas

我有这种格式的数据:

 id  years sex  state

102      0   0  1

102     1   0   1

102     2   0   2

102     3   0   2

102     4   0   2

102     5   0   3

104    0   1   1

104    1.2 1   1 

104    2.4 1   1  

我希望创建额外的新三列("开始"&"结束"超出"州"和"时间&#34 ;出于"年龄"),例如下面的那个

id    years sex state   start   End Time

102     0   0   1          1    1   1

102     1   0   1          1    2   2

102     2   0   2          2    2   3

102     3   0   2          2    2   4

102     4   0   2          2    3   5

102     5   0   3           

104     0   1   1          1    1   1.2 

104     1.2 1   1          1    1   2.4  

104     2.4 1   1

请有人在R或SAS帮我解决这个问题。谢谢,我真的很感激。

1 个答案:

答案 0 :(得分:0)

虽然我没有遵循逻辑,但从您展示的结果来看,似乎会这样做。 dat是数据集。

 dat1 <- transform(dat, Time=ave(years, sex, 
         FUN=function(x) c(x[-1],NA)), start=state, End=ave(state, sex, FUN=function(x) c(x[-1], NA)))

dat1$start[is.na(dat1$End)] <- NA
 dat1
#     id years sex state Time start End
#1 102   0.0   0     1  1.0     1   1
#2 102   1.0   0     1  2.0     1   2
#3 102   2.0   0     2  3.0     2   2
#4 102   3.0   0     2  4.0     2   2
#5 102   4.0   0     2  5.0     2   3
#6 102   5.0   0     3   NA    NA  NA
#7 104   0.0   1     1  1.2     1   1
#8 104   1.2   1     1  2.4     1   1
#9 104   2.4   1     1   NA    NA  NA

使用dplyr

library(dplyr)
dat%>% 
group_by(sex) %>% 
mutate(End=lead(state,1) , 
    Time=lead(years,1),
      start= ifelse(is.na(Time), NA, state)) %>% 
 select(1:4, 7,5,6)

数据

 dat <- structure(list(id = c(102L, 102L, 102L, 102L, 102L, 102L, 104L, 
 104L, 104L), years = c(0, 1, 2, 3, 4, 5, 0, 1.2, 2.4), sex = c(0L, 
 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L), state = c(1L, 1L, 2L, 2L, 2L, 
 3L, 1L, 1L, 1L)), .Names = c("id", "years", "sex", "state"), class = "data.frame",    row.names = c(NA, 
 -9L))