R:重新采样后按组选择行

时间:2017-10-30 14:13:57

标签: r statistics-bootstrap

我想手动为面板数据集进行自举。我需要在个人层面进行聚类以确保后续操作的一致性,也就是说需要在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中尝试了filterdplyr,没有任何效果。基本上这是一个按组索引选择整个组的问题,有什么建议吗?谢谢!

3 个答案:

答案 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)