我有一个数据框:
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))
我的问题:我想创建一个新列,其中包含(二进制)随机数(&#39; 0
&#39;或者&#39; 1
&#39;)用于固定比例(或预先确定的患病率)的病例 'ID' == 1
(例如,随机数&#39; 0
&#39; x 2和&#39; 1
&#39; x 4)。
编辑I: 出于非特定情况的目的,解决方案可能是:
DF$RANDOM[sample(1:nrow(DF), nrow(DF), FALSE)] <- rep(RANDOM, c(nrow(DF)-4,4))
但是,我仍然需要特定于cas的分配,并且前面提到的解决方案没有明确地引用&#39; 0
&#39;或&#39; 1
&#39;。
(注意:变量&#39; value
&#39;与问题无关;只有标识符。)
我在stratified sampling或random row selection上找到相关帖子 - 但这些(和其他)帖子未涵盖此问题。
非常感谢你。
答案 0 :(得分:1)
您可以先按案例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
答案 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)