我有以下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
有没有一种聪明的方法来处理这项任务?非常感谢你!
答案 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