我有一个名为demo的数据框,其中包含500条记录
ID Age
1 10
2 15
3 36
4 20
. .
. .
497 40
498 5
499 12
500 20
在上面的数据框中我想添加一个值,使得总记录的25%(在我们的例子中为125)它们必须在1-3之间,剩下的就是75%(从126开始)必须在4-10之间,这样输出看起来像这个
ID Age colB
1 10 2
2 15 1
3 36 1
4 20 3
. .
. .
497 40 8
498 5 10
499 12 5
500 20 9
我试过了
function(x) {
a= row.names(demo)[125]
a <- FALSE
while (!a) {
demo$colB <- sample(nrow(demo), c(1:3))
}
return(x)
}
非常感谢任何帮助。谢谢
答案 0 :(得分:1)
我们可以尝试使用rep
和sample
demo$colB <- sample(c(rep(1:3, length.out= ceiling(nrow(demo)*.25)),
rep(4:10, length.out=ceiling(nrow(demo)*.75))))[seq_len(nrow(demo))]
sum(demo$colB %in% 1:3)
#[1] 125
根据其他帖子计算sum
sum(demo$colB %in% 1:3)
#[1] 121
两者都使用set.seed(1)
计算sample
(以使其可重现)
set.seed(24)
demo <- data.frame(ID = 1:500, Age = sample(10:99, 500, replace=TRUE))
答案 1 :(得分:1)
试试这个(假设colB
中的值不依赖于其他列的值):
demo$colB <- sample(1:10, nrow(demo), prob = c(rep(0.25/3, 3), rep(0.75/7, 7)), replace=TRUE)