2017-12-12 14 views
0

저는 임상 실험을 위해 LabData라는 데이터 프레임을 가지고 있습니다.이 테스트에는 100 개 이상의 피험자가 있습니다. 각 과목별로 8 회의 실험을 실시 했어야합니다. 나는 테스트 이름의 벡터를 가지고 있으며, 각 테스트에 대해 누락 된 테스트가 무엇인지 말해주는 새로운 데이터 프레임을 출력하려고합니다. 나는 브리핑 표기법뿐만 아니라 일부 dplyr를 사용했지만, 이제까지 주제를 반복하는 방법과 모든 것을 깨끗한 데이터 프레임으로 출력하는 가장 어려운 부분에 관해서는 부족했다. 여기테스트 이름의 벡터를 사용하여 각 테스트에서 누락 된 랩 테스트를 확인하십시오.

은 단순히 대상이없는 시험이 무엇인지 말해,

Tests <- data.frame(Tests=c("T1","T2","T3","T4","T5","T6","T7","T8")) 

LabData= read.table(text=" Subject Tests 
SubjectA T1 
SubjectA T2 
SubjectA T3 
SubjectA T4 
SubjectA T6 
SubjectA T7 
SubjectA T8 
SubjectB T2 
SubjectB T3 
SubjectB T4 
SubjectB T5 
SubjectB T6 
SubjectB T7 
SubjectC T1 
SubjectC T2 
SubjectC T3 
SubjectC T4 
SubjectC T5 
SubjectC T6 
SubjectC T7 
SubjectC T8 
", header=TRUE) 

내 이상적인 출력이 될 것이라고 샘플 데이터에 대한 코드입니다. 나는 그것이 최선의 방법이 될 것입니다 생각으로

Missing <- data.frame(Tests$Tests[!Tests$Tests %in% LabData$Tests]) 

는 또한 tapply 사용하여 시도 : 그것은 내가 이런 식으로 뭔가를 시도

Subject TestMiss 

SubjectA T5 
SubjectB T1 
SubjectB T8 

그들 모두를 반복해야합니다, 그래서 다시 내가 100 개 + 주제를 가지고 각 주제를 반복하지만 현재 데이터의 형식이 제대로 지정되지는 않습니다. 어떤 해결책을 많이 주시면 감사하겠습니다.

+0

"long"형식에서 "wide"형식으로 변환하면 중간에 있습니다 :'require (data.table); dcast (LabData, Subject ~ Tests)'를 선택하십시오. 그런 다음 누락 된 데이터가있는 위치를 찾을 수 있습니다 (예 : 'wide_LabData [,. (missing_trial = which (is.na (.SD))), by = 'Subject']' – Jealie

답변

1

모든 조합을 제공하려면 expand.grid을 사용하고 결과는 열을 mutate으로 지정합니다.

library(dplyr) 

df <- expand.grid(
    Subject = unique(LabData$Subject), 
    Tests = unique(LabData$Tests), 
    stringsAsFactors = FALSE 
) %>% 
    as_tibble %>% 
    arrange(Subject, Tests) %>% 
    mutate(
    TestMiss = !paste0(Subject, Tests) %in% paste0(LabData$Subject, LabData$Tests) 
) 

df 

# # A tibble: 24 x 3 
#  Subject Tests TestMiss 
#  <chr> <chr> <lgl> 
# 1 SubjectA T1 FALSE 
# 2 SubjectA T2 FALSE 
# 3 SubjectA T3 FALSE 
# 4 SubjectA T4 FALSE 
# 5 SubjectA T5  TRUE 
# 6 SubjectA T6 FALSE 
# 7 SubjectA T7 FALSE 
# 8 SubjectA T8 FALSE 
# 9 SubjectB T1  TRUE 
# 10 SubjectB T2 FALSE 
# # ... with 14 more rows 

은 그럼 그냥 filter TestMiss == TRUE는 최종 목록을 구할 수있는 곳.

df %>% filter(TestMiss == TRUE) 

# # A tibble: 3 x 3 
# Subject Tests TestMiss 
#  <chr> <chr> <lgl> 
# 1 SubjectA T5  TRUE 
# 2 SubjectB T1  TRUE 
# 3 SubjectB T8  TRUE