我想手动为面板数据集进行自举。我需要在个人层面进行聚类以确保后续操作的一致性,也就是说需要在bootstrap样本中选择同一个体的所有观察结果。我所做的是对唯一个体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)
然后我根据索引选择行,假设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,]
没有给出我想要的东西。我在subset
中尝试了filter
和dplyr
,没有任何效果。基本上这是一个按组索引选择整个组的问题,有什么建议吗?谢谢!
答案 0 :(得分:0)
%in%
选择相关的行会得到您想要的输出。
> 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
基于{p> 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
答案 1 :(得分:0)
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
答案 2 :(得分:0)
您也可以使用加入来执行此操作:
boot.index = c("B", "B", "C")
merge(data.frame("ID"=boot.index), df, by="ID", all.x=T, all.y=F)