2016-09-18 1 views
1

ID를 기반으로 미래의 날짜에 대한 암시 missingness에 대한 기입 할 수있는 방법이 있나요 미래 기간에 대한 ID로 확장?

예를 들어, 1 월 2016 년 시작하는 실험을 상상한다. 나는 3 명의 참가자가 서로 다른시기에 합류한다. 피실험자 1은 1 월에 나와 합류하고 8 월까지 머물러 있습니다. 2 부는 3 월에 나와 합류하고 8 월까지 실험에 머물러 있습니다. 주제 3은 또한 3 월에 나와 합류하지만, 5 월 중 언젠가는 나가기 때문에 5 월 -8 월 기간 동안 아무런 관측도 기록되지 않습니다.

주제 3은 실험 중퇴 할 때, 어떻게 날짜를 입력 않습니다되는 질문? 여기에 일을 같이하는 방법에 대한 몇 가지 모의 데이터입니다 :

Subject Date 
1  1 Jan-16 
2  1 Feb-16 
3  1 Mar-16 
4  1 Apr-16 
5  1 May-16 
6  1 Jun-16 
7  1 Jul-16 
8  1 Aug-16 
9  2 Mar-16 
10  2 Apr-16 
11  2 May-16 
12  2 Jun-16 
13  2 Jul-16 
14  2 Aug-16 
15  3 Mar-16 
16  3 Apr-16 




structure(list(Subject = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L), Date = structure(c(5L, 4L, 8L, 2L, 
9L, 7L, 6L, 3L, 8L, 2L, 9L, 7L, 6L, 3L, 8L, 2L), .Label = c("", 
"Apr-16", "Aug-16", "Feb-16", "Jan-16", "Jul-16", "Jun-16", "Mar-16", 
"May-16"), class = "factor")), class = "data.frame", row.names = c(NA, 
-16L), .Names = c("Subject", "Date")) 

그리고 여기에 데이터를 같이하는 방법입니다 :

Subject Date 
1  1 Jan-16 
2  1 Feb-16 
3  1 Mar-16 
4  1 Apr-16 
5  1 May-16 
6  1 Jun-16 
7  1 Jul-16 
8  1 Aug-16 
9  2 Mar-16 
10  2 Apr-16 
11  2 May-16 
12  2 Jun-16 
13  2 Jul-16 
14  2 Aug-16 
15  3 Mar-16 
16  3 Apr-16 
17  3 May-16 
18  3 Jun-16 
19  3 Jul-16 
20  3 Aug-16 

structure(list(Subject = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), Date = structure(c(4L, 
3L, 7L, 1L, 8L, 6L, 5L, 2L, 7L, 1L, 8L, 6L, 5L, 2L, 7L, 1L, 8L, 
6L, 5L, 2L), .Label = c("Apr-16", "Aug-16", "Feb-16", "Jan-16", 
"Jul-16", "Jun-16", "Mar-16", "May-16"), class = "factor")), class = "data.frame", row.names = c(NA, 
-20L), .Names = c("Subject", "Date")) 

내가 DataCombine 패키지에서 tidyr에서 expandTimeFill를 사용하여 시도하지만, 이러한 접근 방식의 문제점은 참가자가 실험에 참여하기 전에 일정 기간 동안 날짜를 얻을 수 있다는 것입니다. 이 특별한 경우에는 참가자가 실험을 중단 할 때만 기간을 채우기를 원합니다.

답변

1

tidyr에서 complete 기능은 명시 적으로 암시 측값 측값 회전을 위해 설계된다. 우리는 과거의 완료를 포함하지 않기 위해 약간의 필터링을해야 할 것입니다. 가장 쉬운 방법은 시작 값과 함께 테이블에 가입을 할 것 같다 :

library(dplyr) 
library(tidyr) 

df <- df %>% 
    filter(Date != '') %>% 
    droplevels() %>% 
    group_by(Subject) 

df2 <- summarise(df, start = first(Date)) 

df %>% 
    complete(Subject, Date) %>% 
    left_join(df2) %>% 
    mutate(Date2 = as.Date(paste0('01-', Date), format = '%d-%b-%y'), 
     start = as.Date(paste0('01-', start), format = '%d-%b-%y')) %>% 
    filter(Date2 >= start) %>% 
    arrange(Subject, Date2) %>% 
    select(-start, -Date2) 

결과 :

Source: local data frame [20 x 2] 
Groups: Subject [3] 

    Subject Date 
    <int> <fctr> 
1  1 Jan-16 
2  1 Feb-16 
3  1 Mar-16 
4  1 Apr-16 
5  1 May-16 
6  1 Jun-16 
7  1 Jul-16 
8  1 Aug-16 
9  2 Mar-16 
10  2 Apr-16 
11  2 May-16 
12  2 Jun-16 
13  2 Jul-16 
14  2 Aug-16 
15  3 Mar-16 
16  3 Apr-16 
17  3 May-16 
18  3 Jun-16 
19  3 Jul-16 
20  3 Aug-16 

내가 시작 날짜와 신뢰할 수있는 비교를 할 날짜 변환을 사용하지만, 당신이 수도 어떻게 든 row_number을 사용할 수 있습니다. 문제는 complete이 데이터를 재정렬한다는 것입니다.

p.s. 귀하의 예를 dput 빈 요소 레벨 ("")가 있습니다, 그래서 내가 먼저를 필터링 할 수 있습니다.

+0

왜'하지만 대신'expand'의 complete' 사용할 수 있습니까? – Aramis7d

+1

@ Aramis7d. 다른 변수가 있으면 유지 관리됩니다. 나는 OP가 관찰 된 날짜에 각 과목마다 약간의 측정 값을 가지고있을 가능성이 있다고 생각했고, 그는 단지 최소한의 예를 제시했다. – Axeman

+1

동의. 그러나 OP의 관심사는 합류하기 전의 날짜에 관한 것이었기 때문에 나는 나머지 열을 보존하고 있다고 생각했습니다. 나가 몇몇 유용한 부지깽이 부두에 밖으로 놓치고 있던 경우에 다만 흥미 롭다. 감사! – Aramis7d