簡體   English   中英

如何對數據框中的所有行進行子集化以進行重復測量

[英]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

我可以在哪里子集-使用此示例-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM