2015-06-06 2 views
2

У меня есть следующий набор данных AE (неблагоприятное событие).Данные 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 

Есть ли разумный способ справиться с этой задачей? Большое спасибо!

ответ

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 
+0

Спасибо, bgoldst! Ваш код работает. Потрясающие! – Ocean

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 
+0

Спасибо, Jazzurro. Когда я попробовал код «mydf $ ENDY [is.na (mydf $ ENDY)] <- mydf $ STDY [который (mydf $ ENDY% in% NA) + 1]", набор данных не изменился по какой-либо причине , Спасибо хоть! – Ocean

+0

@Ocean Спасибо за сообщение. Мой код работает на моей машине. Вы создали 'mydf', прежде чем запускать код? Еще одна вещь, когда вы запускаете указанную вами линию, R не возвращает результат автоматически. Вам нужно ввести 'mydf' в R Console. Дайте мне знать, если у вас все еще есть проблема. – jazzurro

Смежные вопросы