纵向数据:试图确定受试者是否进行了随访
Longitudinal data: Trying to establish if the subjects have a followup visit
我正在尝试分析纵向数据。每个科目至少来过一次,最多 3 次。我需要比较每次访问的分数,看看他们的治疗是否有助于减轻症状。
现在,我想设置一些列来指示受试者是否有后续访问。
一栏表示受试者是否第二次就诊,另一栏表示受试者是否回来进行第三次就诊
我的数据集是什么样的
visit_id subject_id visit_number Measure1 Measure2 ...
1 Subject1 1
2 Subject2 1
3 Subject1 2
4 Subject3 1
5 Subject1 3
我尝试编码的内容
使用 sapply 按主题 ID 遍历所有访问,并在该主题有第二次访问和第三次访问时填充列。
我也尝试了一个 for 循环,但在每种情况下我都不确定如何告诉它循环遍历该主题的所有实例,然后 select 项目进行比较(即特定访问的存在数)
sapply(dat$subject_id, function(x) {
if(dat$visit_number == 2) {followup2 <- "yes"
}else {followup2 <- "no"}
if(dat$visit_number == 3) {followup3 <- "yes"
}else {followup3 <- "no"}
})
我希望我的数据集看起来像什么
visit_id subject_id visit_number followup2 followup3
1 Subject1 1 yes yes
3 Subject1 2 yes yes
5 Subject1 3 yes yes
2 Subject2 1 yes no
6 Subject2 2 yes no
4 Subject3 1 no no
我打算使用类似的逻辑来检查每个对象并比较他们在访问中的症状。比较访问 1 和 2,然后比较访问 2 和 3。
数据
dat <- read.table(header = TRUE, stringsAsFactors = FALSE,
text = "visit_id subject_id visit_number
1 Subject1 1
3 Subject1 2
5 Subject1 3
2 Subject2 1
6 Subject2 2
4 Subject3 1")
与其尝试一次完成所有这些,不如将其分开,首先确定受试者是否有第二次(或第三次)访问,然后使用该数据添加一列。
要做第一个:
subj_2_vist <- dat$subject_id[dat$visit_number==2]
现在 subj_2_visit
将成为所有第二次访问的访问者的向量。然后您可以使用 ifelse()
创建新列:
dat$followup2 <- ifelse(dat$subject_id %in% subj_2_visit, "Yes", "No")
通过更改第一部分中的检查,同样可以用于三次访问。
由于您一遍又一遍地重复相同的任务,您可以创建一个函数来完成这项工作,然后循环移动部件。
dat <- read.table(header = TRUE, stringsAsFactors = FALSE,
text = "visit_id subject_id visit_number
1 Subject1 1
3 Subject1 2
5 Subject1 3
2 Subject2 1
6 Subject2 2
4 Subject3 1")
此函数将 visit
除以每个唯一 id
并查看最大值 visit
是否大于 num
f <- function(id, visit, num) {
ave(visit, id, FUN = function(x) if (max(x) >= num) 'yes' else 'no')
}
制作一些测试用例以确保其正常工作
with(dat, f(subject_id, visit_number, 1))
# [1] "yes" "yes" "yes" "yes" "yes" "yes"
with(dat, f(subject_id, visit_number, 2))
# [1] "yes" "yes" "yes" "yes" "yes" "no"
with(dat, f(subject_id, visit_number, 3))
# [1] "yes" "yes" "yes" "no" "no" "no"
然后决定需要循环的内容。您还可以一次性为每个循环迭代在数据框中分配新列:
idx <- 2:3
dat[, paste0('followup', idx)] <- lapply(idx, function(x)
f(dat$subject_id, dat$visit_number, x))
# visit_id subject_id visit_number followup2 followup3
# 1 1 Subject1 1 yes yes
# 2 3 Subject1 2 yes yes
# 3 5 Subject1 3 yes yes
# 4 2 Subject2 1 yes no
# 5 6 Subject2 2 yes no
# 6 4 Subject3 1 no no
我正在尝试分析纵向数据。每个科目至少来过一次,最多 3 次。我需要比较每次访问的分数,看看他们的治疗是否有助于减轻症状。
现在,我想设置一些列来指示受试者是否有后续访问。
一栏表示受试者是否第二次就诊,另一栏表示受试者是否回来进行第三次就诊
我的数据集是什么样的
visit_id subject_id visit_number Measure1 Measure2 ...
1 Subject1 1
2 Subject2 1
3 Subject1 2
4 Subject3 1
5 Subject1 3
我尝试编码的内容
使用 sapply 按主题 ID 遍历所有访问,并在该主题有第二次访问和第三次访问时填充列。
我也尝试了一个 for 循环,但在每种情况下我都不确定如何告诉它循环遍历该主题的所有实例,然后 select 项目进行比较(即特定访问的存在数)
sapply(dat$subject_id, function(x) {
if(dat$visit_number == 2) {followup2 <- "yes"
}else {followup2 <- "no"}
if(dat$visit_number == 3) {followup3 <- "yes"
}else {followup3 <- "no"}
})
我希望我的数据集看起来像什么
visit_id subject_id visit_number followup2 followup3
1 Subject1 1 yes yes
3 Subject1 2 yes yes
5 Subject1 3 yes yes
2 Subject2 1 yes no
6 Subject2 2 yes no
4 Subject3 1 no no
我打算使用类似的逻辑来检查每个对象并比较他们在访问中的症状。比较访问 1 和 2,然后比较访问 2 和 3。
数据
dat <- read.table(header = TRUE, stringsAsFactors = FALSE,
text = "visit_id subject_id visit_number
1 Subject1 1
3 Subject1 2
5 Subject1 3
2 Subject2 1
6 Subject2 2
4 Subject3 1")
与其尝试一次完成所有这些,不如将其分开,首先确定受试者是否有第二次(或第三次)访问,然后使用该数据添加一列。
要做第一个:
subj_2_vist <- dat$subject_id[dat$visit_number==2]
现在 subj_2_visit
将成为所有第二次访问的访问者的向量。然后您可以使用 ifelse()
创建新列:
dat$followup2 <- ifelse(dat$subject_id %in% subj_2_visit, "Yes", "No")
通过更改第一部分中的检查,同样可以用于三次访问。
由于您一遍又一遍地重复相同的任务,您可以创建一个函数来完成这项工作,然后循环移动部件。
dat <- read.table(header = TRUE, stringsAsFactors = FALSE,
text = "visit_id subject_id visit_number
1 Subject1 1
3 Subject1 2
5 Subject1 3
2 Subject2 1
6 Subject2 2
4 Subject3 1")
此函数将 visit
除以每个唯一 id
并查看最大值 visit
是否大于 num
f <- function(id, visit, num) {
ave(visit, id, FUN = function(x) if (max(x) >= num) 'yes' else 'no')
}
制作一些测试用例以确保其正常工作
with(dat, f(subject_id, visit_number, 1))
# [1] "yes" "yes" "yes" "yes" "yes" "yes"
with(dat, f(subject_id, visit_number, 2))
# [1] "yes" "yes" "yes" "yes" "yes" "no"
with(dat, f(subject_id, visit_number, 3))
# [1] "yes" "yes" "yes" "no" "no" "no"
然后决定需要循环的内容。您还可以一次性为每个循环迭代在数据框中分配新列:
idx <- 2:3
dat[, paste0('followup', idx)] <- lapply(idx, function(x)
f(dat$subject_id, dat$visit_number, x))
# visit_id subject_id visit_number followup2 followup3
# 1 1 Subject1 1 yes yes
# 2 3 Subject1 2 yes yes
# 3 5 Subject1 3 yes yes
# 4 2 Subject2 1 yes no
# 5 6 Subject2 2 yes no
# 6 4 Subject3 1 no no