R:从邻行的条目中创建随机样本



我正在使用R编程语言。

我有以下数据集:

my_data = data.frame(id = c(1,2,3,4,5), n = c(15,3,51,8,75))

我想创建一个新变量,根据"n"的相应值为每行生成一个随机整数。我试着用下面的代码做到这一点:

my_data$rand = sample.int(my_data$n,1)

但这不起作用(相同的随机数重复了5次)。

我还试图定义一个函数:

my_function <- function(x){sample.int(x,1)}
transform(my_data, new_column= my_function(my_data$n) )

但这也不工作(相同的随机数再次重复5次)..

最后,我想达到这样的目标:

my_data$rand = c(sample.int(15,1), sample.int(3,1), sample.int(51,1), sample.int(8,1), sample.int(75,1))

有人能告诉我如何为更大的数据集做到这一点,而不必手动指定每个"sample.int"命令吗?

谢谢!

当你说"基于n的值"你这话到底是什么意思?基于n如何?

猜# 1:在每一行,你想画一个随机数,可能的值是1到n猜# 2:在每一行中,您要为0到1之间的可能值绘制n随机数。

第二个选项比较难,但是选项#1可以通过循环来完成:

my_data = data.frame(id = c(1,2,3,4,5), n = c(15,3,51,8,75))
my_data$rand = NA
set.seed(123)
for(i in 1:nrow(my_data)){
my_data$rand[i] = sample(1:(my_data$n[i]), size = 1)
}
my_data
id  n rand
1  1 15   15
2  2  3    3
3  3 51   51
4  4  8    6
5  5 75   67

我们可以使用sapply来遍历my_data中的所有行,并且每次迭代生成一个sample.int

my_data$rand <- sapply(1:nrow(my_data), function(x) sample.int(my_data[x, 2], 1))
id  n rand
1  1 15    7
2  2  3    2
3  3 51   28
4  4  8    6
5  5 75    9

您可以通过单个调用runif(),乘以n并四舍五入来高效地完成此操作:

transform(my_data, rand = ceiling(runif(n) * n))
id  n rand
1  1 15   13
2  2  3    1
3  3 51   41
4  4  8    1
5  5 75    9

最新更新