我正在使用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