定义案例的R(分层)随机抽样
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了定义案例的R(分层)随机抽样相关的知识,希望对你有一定的参考价值。
我有一个数据框:
DF <- data.frame(Value = c("AB", "BC", "CD", "DE", "EF", "FG", "GH", "HI", "IJ", "JK", "KL", "LM"),
ID = c(1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1))
我的问题:我想创建一个新的列,其中包含一个(二进制)随机数('0
'或'1
')用于具有固定比例(或预定义的普遍性)的'ID' == 1
病例(例如,随机数'0
' x 2和'1
'x 4)。
编辑I:对于非特定情况的目的,解决方案可能是:
DF$RANDOM[sample(1:nrow(DF), nrow(DF), FALSE)] <- rep(RANDOM, c(nrow(DF)-4,4))
但是,我仍然需要特定于cas的赋值,并且前面提到的解决方案没有明确地引用'0
'或'1
'。
(注意:变量'value
'与问题无关;只有标识符。)
我在stratified sampling或random row selection上找到了相关的帖子 - 但这个(和其他)帖子没有涵盖这个问题。
非常感谢你提前。
答案
您可以先通过案例ID == 1
对数据进行子集化。为了确保出现1和0,我们使用rep
函数并在replace
函数中将sample
设置为False。
这是一个解决方案。
library(data.table)
set.seed(121)
DF[ID == 1, new_column := sample(rep(c(0,1), c(2,4)), .N, replace = F)]
print(DF1)
Value ID new_column
1: AB 1 1
2: BC 0 NA
3: CD 0 NA
4: DE 1 1
5: EF 0 NA
6: FG 1 1
7: GH 1 1
8: HI 0 NA
9: IJ 0 NA
10: JK 1 0
11: KL 0 NA
12: LM 1 0
另一答案
library(dplyr)
DF <- data.frame(Value = c("AB", "BC", "CD", "DE", "EF", "FG", "GH",
"HI", "IJ", "JK", "KL", "LM"),
ID = c(1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1),
stringsAsFactors = FALSE)
DF %>% group_by(ID) %>% sample_n(4, replace = FALSE)
以上是关于定义案例的R(分层)随机抽样的主要内容,如果未能解决你的问题,请参考以下文章