根据不同个体的时间点列表提取数据
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))
我正在尝试根据不同个人所需的时间点列表提取数据集的行。在 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))