R语言中按行从均匀分布采样,为何y列值全部相同?
问题描述
现有如下数据:
df <- data.frame(id=1:5, x_min = c(0.1,0.2,0.3,0.4,0.5), x_max = c(0.15,0.23,0.38,0.44,0.57))
我想为每行从对应的均匀分布(区间为x_min到x_max)中抽取一个随机样本,但运行以下代码后,y列的所有值均相同:
set.seed(12) df$y <- runif(1, min=df$x_min, max=df$x_max)
输出结果:
> df id x_min x_max y 1 1 0.1 0.15 0.103468 2 2 0.2 0.23 0.103468 3 3 0.3 0.38 0.103468 4 4 0.4 0.44 0.103468 5 5 0.5 0.57 0.103468
原因分析
问题出在runif()函数的第一个参数:你传入了1,这表示只生成1个随机数。当你把这个单个值赋值给长度为5的df$y时,R会自动将这个值循环重复,填充整个列,所以所有行的y值都一样。
另外,虽然你传入了长度为5的min和max向量,但因为只要求生成1个随机数,runif()只会用向量的第一个元素(min=0.1,max=0.15)来生成这个唯一的随机数,这也是为什么结果落在第一行的区间里。
解决方法
把runif()的第一个参数改成数据框的行数(nrow(df)),这样函数会为每个min和max的配对生成一个独立的随机数:
set.seed(12) df$y <- runif(nrow(df), min=df$x_min, max=df$x_max)
运行后输出:
> df id x_min x_max y 1 1 0.1 0.15 0.103468 2 2 0.2 0.23 0.218080 3 3 0.3 0.38 0.340451 4 4 0.4 0.44 0.418722 5 5 0.5 0.57 0.523815
内容的提问来源于stack exchange,提问作者iGada
相关产品推荐
相关产品推荐

