R 如何从数据框中子集所有行以进行重复测量

R 如何从数据框中子集所有行以进行重复测量,r,panel-data,R,Panel Data,我的问题的背景是: 我有一个由重复测量组成的数据集,每行一个数据点。这些数据来自纵向研究,因此目前并非每个受试者都有所有数据点 我希望能够提取满足标准的所有数据点,即所有重复测量,或具有两个重复测量的数据点 下面是一个简化的示例: 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,

我的问题的背景是: 我有一个由重复测量组成的数据集,每行一个数据点。这些数据来自纵向研究,因此目前并非每个受试者都有所有数据点

我希望能够提取满足标准的所有数据点,即所有重复测量,或具有两个重复测量的数据点

下面是一个简化的示例:

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 )
因此:

  • 受试者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
>data.2.measures data.2.measures
subject.id访问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
轻松实现这一点。因此,您将根据
subject.id
对您进行分组,并根据计数进行筛选。因此,在本例中,它只是:

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)

既然您要求函数,下面是另一个base R解决方案:

measures <- function(visits) {
  patients <- df1$subject.id[df1$visit %in% visits]
  df1[df1$subject.id %in% patients,]
}
注意:我使用
df1或使用base R:
indx将数据帧的名称更改为更小的名称
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
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