如何对数据框中的所有行进行子集化以进行重复测量
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
所以:
- 受试者 0 和 1 有基线和两个重复测量,
- 受试者 2 有基线测量和一项重复测量,并且
- 主题 3 只有基线测量。
我希望能够有选择地为具有两个重复测量(或一个或仅基线)的所有主题进行子集化,其中包含所有数据,即:
> 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
我可以对 where 进行子集化 - 使用此示例 - visit == 2。但是后来我不知道如何为具有第二次访问数据点的受试者提取访问 0 和 1 的数据。从概念上讲,我可以看到我知道 subject.id 并且可以以某种方式使用此信息,但我不确定如何使用列表进行子集化。潜在帮助的%in%算子来了吗?
有什么想法吗?提前致谢。
您可以使用 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
将数据框的名称更改为更小的名称
我提问的背景是: 我有一个由重复测量组成的数据集,每行一个数据点。这些数据来自纵向研究,因此目前并非每个受试者都有所有数据点。
我希望能够提取所有符合标准的数据点,即所有重复测量,或具有两次重复测量的数据点。
这是一个简化的例子:
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
所以:
- 受试者 0 和 1 有基线和两个重复测量,
- 受试者 2 有基线测量和一项重复测量,并且
- 主题 3 只有基线测量。
我希望能够有选择地为具有两个重复测量(或一个或仅基线)的所有主题进行子集化,其中包含所有数据,即:
> 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
我可以对 where 进行子集化 - 使用此示例 - visit == 2。但是后来我不知道如何为具有第二次访问数据点的受试者提取访问 0 和 1 的数据。从概念上讲,我可以看到我知道 subject.id 并且可以以某种方式使用此信息,但我不确定如何使用列表进行子集化。潜在帮助的%in%算子来了吗?
有什么想法吗?提前致谢。
您可以使用 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