根据不同个体的时间点列表提取数据

Extract data based on a list of time points from different individuals

我正在尝试根据不同个人所需的时间点列表提取数据集的行。在 base R 中有什么方法可以做到?

这是原始数据集:

data.frame(id=rep(1:3, each=3), time=1:3, y=c(1:9))

这是我想用来提取数据的每个 id 的时间点列表:

$`1` #this is id 1
 [1] 1 2 #these are the time points I need for id 1

$`2`
 [1] 1 3

$`3`
 [1] 2 3

所以最后的数据是这样的:

  id time y
   1    1 1
   1    2 2
   2    1 4
   2    3 6
   3    2 8
   3    3 9

一种使用左连接的方法:

df <- data.frame(id=rep(1:3, each=3), time=1:3, y=c(1:9))
want <- data.frame(id = rep(1:3, each = 2), 
                   time = c(1,2,1,3,2,3))

merge(want, df, all.x = TRUE)      

结果

  id time y
1  1    1 1
2  1    2 2
3  2    1 4
4  2    3 6
5  3    2 8
6  3    3 9

这里有两种遵循相同逻辑的方法。

在基础 R 中 -

do.call(rbind, Map(function(p, q) subset(data, id == q & time %in% p), 
        lst, names(lst)))

或使用tidyverse-

library(dplyr)
library(purrr)

purrr::imap_dfr(lst, ~data %>% filter(id == .y, time %in% .x))

#  id time y
#1  1    1 1
#2  1    2 2
#3  2    1 4
#4  2    3 6
#5  3    2 8
#6  3    3 9

数据

data <- data.frame(id=rep(1:3, each=3), time=1:3, y= 1:9)
lst <- list(`1` = c(1, 2), `2` = c(1, 3), `3` = c(2, 3))