AE数据:估算缺失的结束日,然后从开始日到结束日插入行

时间:2015-06-06 01:35:10

标签: r

我有以下AE(不良事件)数据集。

ID  GR    STDY  ENDY
1    3     2     4
1    2     4     NA
1    1     7     9
2    1     1     NA
2    3     3     5
2    2     5     NA

当ENDY = NA时,我想在相同主题的下一行上使用STDY进行输入,但如果它是该主题的最后一个条目,则在同一行设置相同的STDY,因此数据集看起来像:

ID  GR    STDY  ENDY
1    3     2     4
1    2     4     7
1    1     7     9
2    1     1     3
2    3     3     5
2    2     5     5

然后我想创建一个看起来像这样的新数据集(对于ID = 1),这实际上是将数据集扩展为每天有一行,GR值从STDY开始并在ENDY结束。

ID  GR   DY  
1    3    2
1    3    3
1    3    4
1    2    4
1    2    5
1    2    6
1    2    7
1    1    7
1    1    8
1    1    9

有没有一种聪明的方法来处理这项任务?非常感谢你!

2 个答案:

答案 0 :(得分:1)

这是我的尝试。

mydf <- read.table(text = "ID  GR    STDY  ENDY
1    3     2     4
1    2     4     NA
1    1     7     9
2    1     1     NA
2    3     3     5
2    2     5     NA", header = T)

library(dplyr)

mydf$ENDY[is.na(mydf$ENDY)] <- mydf$STDY[which(mydf$ENDY %in% NA) + 1]

#  ID GR STDY ENDY
#1  1  3    2    4
#2  1  2    4    7
#3  1  1    7    9
#4  2  1    1    3
#5  2  3    3    5
#6  2  2    5   NA

然后,处理不规则的。

mydf$ENDY[is.na(mydf$ENDY)] <- mydf$STDY[which(mydf$ENDY %in% NA)]

#  ID GR STDY ENDY
#1  1  3    2    4
#2  1  2    4    7
#3  1  1    7    9
#4  2  1    1    3
#5  2  3    3    5
#6  2  2    5    5

使用这个新的mydf,我为你的第二个问题做了以下几点。

group_by(mydf, ID, GR) %>%
do(data.frame(DY = seq(.$STDY, .$ENDY)))

#   ID GR DY
#1   1  1  7
#2   1  1  8
#3   1  1  9
#4   1  2  4
#5   1  2  5
#6   1  2  6
#7   1  2  7
#8   1  3  2
#9   1  3  3
#10  1  3  4
#11  2  1  1
#12  2  1  2
#13  2  1  3
#14  2  2  5
#15  2  3  3
#16  2  3  4
#17  2  3  5

答案 1 :(得分:1)

df <- data.frame(ID=c(1,1,1,2,2,2), GR=c(3,2,1,1,3,2), STDY=c(2,4,7,1,3,5), ENDY=c(4,NA,9,NA,5,NA) );
df;
##   ID GR STDY ENDY
## 1  1  3    2    4
## 2  1  2    4   NA
## 3  1  1    7    9
## 4  2  1    1   NA
## 5  2  3    3    5
## 6  2  2    5   NA
df$ENDY <- unlist(by(df[,c('STDY','ENDY')],df$ID,function(x) { x$ENDY[is.na(x$ENDY)] <- c(x$STDY,x$STDY[nrow(x)])[which(is.na(x$ENDY))+1]; x$ENDY; }));
df;
##   ID GR STDY ENDY
## 1  1  3    2    4
## 2  1  2    4    7
## 3  1  1    7    9
## 4  2  1    1    3
## 5  2  3    3    5
## 6  2  2    5    5
df2 <- cbind(df[rep(1:nrow(df),df$ENDY-df$STDY+1),c('ID','GR')],DY=sequence(df$ENDY-df$STDY+1)+rep(df$STDY,df$ENDY-df$STDY+1)-1);
df2;
##     ID GR DY
## 1    1  3  2
## 1.1  1  3  3
## 1.2  1  3  4
## 2    1  2  4
## 2.1  1  2  5
## 2.2  1  2  6
## 2.3  1  2  7
## 3    1  1  7
## 3.1  1  1  8
## 3.2  1  1  9
## 4    2  1  1
## 4.1  2  1  2
## 4.2  2  1  3
## 5    2  3  3
## 5.1  2  3  4
## 5.2  2  3  5
## 6    2  2  5