R:重采样后按组 select 行

R: select rows by group after resampling

我想为面板数据集手动执行 bootstrapping。我需要在个体层面进行聚类,以确保后期操作的一致性,也就是说,对同一个体的所有观察都需要在 bootstrap 个样本中进行 selected。我所做的是对用作索引的唯一个体 ID 的向量进行重采样和替换。

df <- data.frame(ID = c("A","A","A","B","B","B","C","C","C"), v1 = c(3,1,2,4,2,2,5,6,9), v2 = c(1,0,0,0,1,1,0,1,0))

boot.index <- sample(unique(df$ID), replace = TRUE)

然后我select根据索引行,假设boot.index = (B, B, C),我想要一个这样的数据框

ID v1 v2
B  4  0
B  2  1
B  2  1
B  4  0 
B  2  1
B  2  1
C  5  0
C  6  1
C  9  0

显然df1 <- df[df$ID == testboot.index,]没有给我想要的。我在 dplyr 中尝试了 subsetfilter,但没有任何效果。基本上这是一个 select 按组索引对整个组进行排序的问题,有什么建议吗?谢谢!

%in% 到 select 相关行将获得您想要的输出。

> df
  ID v1 v2
1  A  3  1
2  A  1  0
3  A  2  0
4  B  4  0
5  B  2  1
6  B  2  1
7  C  5  0
8  C  6  1
9  C  9  0
> boot.index
[1] A B A
Levels: A B C
> df[df$ID %in% boot.index,]
  ID v1 v2
1  A  3  1
2  A  1  0
3  A  2  0
4  B  4  0
5  B  2  1
6  B  2  1
基于

dplyr::filter的解决方案:

> df %>% filter(ID  %in% boot.index)
  ID v1 v2
1  A  3  1
2  A  1  0
3  A  2  0
4  B  4  0
5  B  2  1
6  B  2  1
set.seed(42)
boot.index <- sample(unique(df$ID), replace = TRUE)
boot.index
#[1] C C A
#Levels: A B C

do.call(rbind, lapply(boot.index, function(x) df[df$ID == x,]))
#   ID v1 v2
#7   C  5  0
#8   C  6  1
#9   C  9  0
#71  C  5  0
#81  C  6  1
#91  C  9  0
#1   A  3  1
#2   A  1  0
#3   A  2  0

您也可以通过连接来做到这一点:

boot.index = c("B", "B", "C")
merge(data.frame("ID"=boot.index), df, by="ID", all.x=T, all.y=F)