【问题标题】:Flag randomly selected N rows by group in data.table在data.table中按组标记随机选择的N行
【发布时间】:2023-03-13 17:18:02
【问题描述】:

在 C3 列的 data.table 中,我想按每个组 (C1) 标记 N 个随机选择的行。在 SO hereherehere 上已经提出了几个类似的问题。但是根据答案仍然无法弄清楚如何为我的任务找到解决方案。

set.seed(1)    
dt = data.table(C1 = c("A","A","A","B","C","C","C","D","D","D"), 
                 C2 = c(2,1,3,1,2,3,4,5,4,5)) 

dt
    C1 C2
 1:  A  2
 2:  A  1
 3:  A  3
 4:  B  1
 5:  C  2
 6:  C  3
 7:  C  4
 8:  D  5
 9:  D  4
10:  D  5

这里是每个 C1 组随机选择的两个行的行索引(不适用于 B 组):

dt[, sample(.I, min(.N, 2)), by = C1]$V1
[1]  1  3  3  7  5 10  9

注意:B 组只应选择一行,因为 B 组仅包含一行。

这里是每个组中一个随机选择的行的解决方案,这通常不适用于 B 组:

dt[, C3 := .I == sample(.I, 1), by = C1]
dt
    C1 C2    C3
 1:  A  2 FALSE
 2:  A  1  TRUE
 3:  A  3 FALSE
 4:  B  1 FALSE
 5:  C  2  TRUE
 6:  C  3 FALSE
 7:  C  4 FALSE
 8:  D  5  TRUE
 9:  D  4 FALSE
10:  D  5 FALSE

实际上我想将它扩展为 N 行。我试过(两行):

dt[, C3 := .I==sample(.I, min(.N, 2)), by = C1]

这当然行不通。

非常感谢任何帮助!

【问题讨论】:

    标签: r data.table


    【解决方案1】:
    dt[, C3 := 1:.N %in% sample(.N, min(.N, 2)), by = C1]
    

    或者用head,不过我觉得应该会慢一些

    dt[, C3 := 1:.N %in% head(sample(.N), 2) , by = C1]
    

    如果标记的行数不是恒定的,你可以这样做

    flagsz <- c(2, 1, 2, 3)
    dt[, C3 := 1:.N %in% sample(.N, min(.N, flagsz[.GRP])), by = C1]
    

    【讨论】:

    • 感谢您的快速回答!只是为了理解:我们检查所有行是否被采样并且那些被采样的接收到 TRUE,对吧?
    • 是的。 1:.N 给出组内行号,如果行号在这些行号sample(.N, min(.N, 2)) 的样本中,那么C3TRUE
    • 我想知道如果每个组 C1 要标记的项目数不同怎么办?假设 N = c(2, 1, 2, 3)
    • 太棒了!谢谢,瑞恩!
    【解决方案2】:
    N=2
    dt[, C3 := {if (.N < N) rep(TRUE,.N) else 1:.N %in%  sample(.N,N) }, by=C1]
    dt
    # C1 C2    C3
    # 1:  A  2  TRUE
    # 2:  A  1 FALSE
    # 3:  A  3  TRUE
    # 4:  B  1  TRUE
    # 5:  C  2 FALSE
    # 6:  C  3  TRUE
    # 7:  C  4  TRUE
    # 8:  D  5  TRUE
    # 9:  D  4  TRUE
    # 10:  D  5 FALSE
    

    【讨论】:

    • 谢谢!你的回答很好。我接受了 Ryan 的回答,因为他的回答不包含 if-else。
    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2016-04-17
    • 2013-06-14
    • 2021-09-13
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多