[英]How to subset all rows from data frame for repeated measures
我的问题的背景是:我有一个包含重复测量的数据集,每行一个数据点。 这些数据来自纵向研究,因此目前并非每个受试者都具有所有数据点。
我希望能够提取符合条件的所有数据点,即所有重复测量或具有两个重复测量的数据点。
这是一个简化的示例:
subject.id <- c( 0, 0, 0, 1, 1, 1, 2, 2, 3 )
visit <- c( 0, 1, 2, 0, 1, 2, 0, 1, 0 )
data.value <- c( 32, 35, 38, 12, 18, 24, 9, 13, 21 )
data.from.study <- data.frame( subject.id, visit, data.value )
结果是:
subject.id visit data.value
1 0 0 32
2 0 1 35
3 0 2 38
4 1 0 12
5 1 1 18
6 1 2 24
7 2 0 9
8 2 1 13
9 3 0 21
所以:
我希望能够为具有两个重复测量(或一个或只是基线)的所有主题选择性地子集化,其中包括所有存在的数据,即:
> data.2.measures <- ??
> data.2.measures
subject.id visit data.value
1 0 0 32
2 0 1 35
3 0 2 38
4 1 0 12
5 1 1 18
6 1 2 24
我可以在哪里子集-使用此示例-visit == 2 。 但是然后我看不到如何为那些具有第二个访问数据点的主题提取访问0和1的数据。 从概念上讲,我可以知道我知道subject.id,并且可以某种方式使用此信息,但是我不确定如何使用列表进行子集化。 这里的%in%运算符是潜在帮助吗?
有什么想法吗? 提前致谢。
您可以使用dplyr
轻松实现这一dplyr
。 因此,您将group_by
subject.id
并按计数进行filter
。 因此,在此示例中,它就是:
library(dplyr)
subject.id <- c( 0, 0, 0, 1, 1, 1, 2, 2, 3 )
visit <- c( 0, 1, 2, 0, 1, 2, 0, 1, 0 )
data.value <- c( 32, 35, 38, 12, 18, 24, 9, 13, 21 )
data.from.study <- data.frame( subject.id, visit, data.value )
data.from.study %>% group_by(subject.id) %>%
filter(n() == 3)
将输出:
Source: local data frame [6 x 3]
Groups: subject.id
subject.id visit data.value
1 0 0 32
2 0 1 35
3 0 2 38
4 1 0 12
5 1 1 18
6 1 2 24
既然您需要一个函数,这是另一个基本的R解决方案:
measures <- function(visits) {
patients <- df1$subject.id[df1$visit %in% visits]
df1[df1$subject.id %in% patients,]
}
因此,您可以执行以下操作:
measures(1)
subject.id visit data.value
1 0 0 32
2 0 1 35
3 0 2 38
4 1 0 12
5 1 1 18
6 1 2 24
7 2 0 9
8 2 1 13
#and
measures(2)
subject.id visit data.value
1 0 0 32
2 0 1 35
3 0 2 38
4 1 0 12
5 1 1 18
6 1 2 24
注意:我使用df1 <- data.from.study
将数据框的名称更改为较小的df1 <- data.from.study
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.