我有这种格式的数据:
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帮我解决这个问题。谢谢,我真的很感激。
答案 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))