使用测试名称的向量检查每个主题缺少哪些实验室测试

时间:2017-12-12 22:38:53

标签: r missing-data

我正在为我的临床试验做一项任务,我有一个名为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)

我理想的输出就是这个,只是告诉我哪些科目缺少哪些测试。我再次拥有100多个科目,因此需要遍历所有科目

Subject  TestMiss

SubjectA   T5
SubjectB   T1
SubjectB   T8 

我尝试过这样的事情:

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

还尝试使用tapply,因为我认为这将是循环每个主题的最佳方式,但是当前数据的格式化方式没有成功。非常感谢任何解决方案。

1 个答案:

答案 0 :(得分: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