如何对数据帧中的所有行进行子集以重复测量

时间:2015-05-19 07:10:19

标签: 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, 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

我能够在哪里进行子集 - 使用此示例 - visit == 2 。但是,对于那些有第二次访问数据点的主题,我不知道如何为访问0和1提取数据。从概念上讲,我可以看到我知道subject.id并且可以某种方式使用这些信息,但我不确定如何使用列表进行子集化。 %in%运营商是否有潜在的帮助?

有什么想法?提前谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用dplyr轻松实现此目的。因此,您将group_by subject.idfilter计数。所以在这个例子中,它只是:

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

答案 1 :(得分:0)

由于你要求一个功能,这里是另一个基本的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

将数据框的名称更改为更小的名称