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