Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 标记data.table中按组随机选择的N行_R_Data.table - Fatal编程技术网

R 标记data.table中按组随机选择的N行

R 标记data.table中按组随机选择的N行,r,data.table,R,Data.table,在C3列的data.table中,我想标记每组随机选择的N行(C1)。有几个类似的问题已经被问过了。但基于这些答案,我仍然无法为我的任务找到解决方案 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

在C3列的data.table中,我想标记每组随机选择的N行(C1)。有几个类似的问题已经被问过了。但基于这些答案,我仍然无法为我的任务找到解决方案

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组不起作用):

注意:对于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 := 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]
flagsz
或者使用
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]
flagsz
N=2
dt[,C3:={if(.N
N=2
dt[,C3:={if(.N
谢谢您的快速回答!要理解的是:我们检查所有行是否都进行了采样,而那些被采样的行接收到的是真的,对吗?是的<代码>1:.N
给出组内行号,如果行号在这些行号的样本中
样本(.N,min(.N,2))
C3
TRUE
我想知道如果每个组C1要标记的项目数不同会怎样?假设N=c(2,1,2,3)太棒了!谢谢你,瑞安!谢谢你的快速回答!要理解的是:我们检查所有行是否都进行了采样,而那些被采样的行接收到的是真的,对吗?是的<代码>1:.N
给出组内行号,如果行号在这些行号的样本中
样本(.N,min(.N,2))
C3
TRUE
我想知道如果每个组C1要标记的项目数不同会怎样?假设N=c(2,1,2,3)太棒了!谢谢你,瑞安!谢谢你的回答很好。我接受了Ryan的答案,因为他的答案不包括if-else。谢谢!你的回答很好。我接受了Ryan的答案,因为他的答案不包括if-else。
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