【问题标题】:Randomly separate one column into two groups based on ID in R根据R中的ID将一列随机分成两组
【发布时间】:2021-04-11 20:46:34
【问题描述】:

我有一个看起来像这样的数据框。对于每个 ID,我想将主题随机分配到两个主题相对相等的组中,并且我还想添加一个新列来指示他们所在的组。例如,对于 ID 1,将 101 和 103 分配到组中A、102、104属于B组;对于 ID 2、105 和 106 在 A 组中,107 在 B 组中。而且我有数千个 ID 和主题,我该如何做到这一点?

   ID subject
1  1     101
2  1     102
3  1     103
4  1     104
4  2     105
5  2     106
6  2     107

【问题讨论】:

    标签: r


    【解决方案1】:

    对于每个ID,您可以使用replace = TRUE 重复您想要重复的sample 值,其中每个值的出现概率相同。

    library(dplyr)
    groups <- c('Group A', 'Group B')
    
    df %>%
      group_by(ID) %>%
      mutate(group = sample(groups, n(), replace = TRUE)) -> result
    

    请注意,以上内容是完全随机的,有可能一个有 4 行的 ID 有 3 行有 Group A 和 1 有 Group B。如果您希望这两个组始终均匀分布,您可以使用repsample 来获得随机性。

    df %>%
      group_by(ID) %>%
      mutate(group = sample(rep(groups, length.out = n()))) -> result
    

    【讨论】:

    • 解决方案是有偏见的; A 组在 ID 长度不均匀的情况下具有优势。
    【解决方案2】:

    使用ave 应用FUNction ID-wise,我们可以重复一个向量1:2 length(ID) 次和sample 它;这可以通过rep_length 完成。为了避免向量总是从 1 开始(从而有利于一个组),我们还对向量进行了采样。

    res <- transform(d, g=ave(ID, ID, FUN=function(x) 
      sample(rep_len(1:2, length(x)))))
    res
    #   ID subject g
    # 1  1     101 2
    # 2  1     102 1
    # 3  1     103 2
    # 4  1     104 1
    # 5  2     105 1
    # 6  2     106 2
    # 7  2     107 1
    

    检查一个稍大的数据框:

    d2 <- data.frame(ID=rep(1:10, each=7), subject=1:70)
    res2 <- transform(d2, g=ave(ID, ID, FUN=function(x) 
      sample(rep_len(sample(1:2), length(x)))))
    with(res2, table(g, ID))
    #    ID
    # g   1 2 3 4 5 6 7 8 9 10
    #   1 4 4 3 4 4 3 4 3 4  3
    #   2 3 3 4 3 3 4 3 4 3  4
    

    数据:

    d <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), subject = 101:107), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6", "7"))
    

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多