【问题标题】:How to subset all rows from data frame for repeated measures如何对数据框中的所有行进行子集化以进行重复测量
【发布时间】:2015-05-19 07:10:18
【问题描述】:

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

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

这是一个简化的例子:

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% 操作符在这里有潜在帮助吗?

有什么想法吗?提前致谢。

【问题讨论】:

    标签: r panel-data


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 或者使用base R: indx &lt;- with(data.from.study, ave(subject.id, subject.id, FUN = length)) == 3 然后data.from.study[indx, ]
    【解决方案2】:

    既然你要求一个函数,这里是另一个基本的 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 &lt;- data.from.study将数据框的名称更改为更小的名称

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多