【问题标题】:R: select rows by group after resamplingR:重采样后按组选择行
【发布时间】:2018-04-11 13:28:46
【问题描述】:

我想为面板数据集手动进行引导。我需要在个体层面进行聚类,以确保后续操作的一致性,也就是说,需要在引导样本中选择同一个体的所有观察结果。我所做的是对用作索引的唯一个体 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 &lt;- df[df$ID == testboot.index,] 没有给出我想要的。我在dplyr 中尝试了subset 和filter,没有任何效果。基本上这是按组索引选择整个组的问题,有什么建议吗?谢谢!

【问题讨论】:

    标签: r statistics-bootstrap


    【解决方案1】:

    %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
    

    基于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
    

    【讨论】:

    • @amrrs 完成了一半,但我仍然需要在 B 组之后重复 A 组
    • @amrrs 是的,这就是引导的重点 - 使用样本重新采样,所以一些观察意味着出现不止一次。
    • 那是基于索引的吧?所以你有两次 A 并且重复没有?
    • @amrss 我得到了两次 A,所以我需要选择 A 的所有观察值两次。
    【解决方案2】:
    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
    

    【讨论】:

    • 顺序其实并不重要,是C C A还是C A C都无所谓
    【解决方案3】:

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

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

    【讨论】:

    • @ags29 谢谢。您的回答也很聪明,但我更喜欢直接在同一个数据帧上操作而不是创建新数据帧并进行合并,所以我接受 d.b 的回答。
    猜你喜欢
    • 2020-02-12
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多