我正在为我的临床试验做一项任务,我有一个名为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,因为我认为这将是循环每个主题的最佳方式,但是当前数据的格式化方式没有成功。非常感谢任何解决方案。
答案 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