Как подмножить все строки из фрейма данных для повторных измерений

Предыстория моего вопроса: у меня есть набор данных, состоящий из повторяющихся измерений, по одной точке данных в строке. Эти данные взяты из лонгитюдного исследования, поэтому на данный момент не у каждого испытуемого есть все точки данных.

Я хотел бы иметь возможность извлекать все точки данных, соответствующие критериям, то есть все повторяющиеся измерения или те, которые имеют два повторных измерения.

Вот упрощенный пример:

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

So:

  • Субъекты 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% потенциальной помощи?

Есть предположения? Заранее спасибо.


person bitcyber    schedule 19.05.2015    source источник


Ответы (2)


Вы можете легко добиться этого, используя 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
person chappers    schedule 19.05.2015
comment
Или используя базу R: indx <- with(data.from.study, ave(subject.id, subject.id, FUN = length)) == 3, а затем data.from.study[indx, ] - person talat; 19.05.2015

Поскольку вы просили функцию, вот еще одно базовое решение 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.

person Pierre L    schedule 19.05.2015