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
中尝试了 subset
和 filter
,但没有任何效果。基本上这是一个 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)
我想为面板数据集手动执行 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
中尝试了 subset
和 filter
,但没有任何效果。基本上这是一个 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)