gpt4 book ai didi

r - 如何在具有范围的 data.frame 中生成随机数

转载 作者:行者123 更新时间:2023-12-02 04:20:45 25 4
gpt4 key购买 nike

我有一个data.frame我想按序列生成每个列表的随机数。

我用过sample函数来创建随机数,但即使我为列表 [[1]] 创建了随机数,套装[[2]]再次产生相同的数字。那么,在这里我如何为集合 [[2]] 创建不同的随机数。

这是简单的代码;

data.list <- lapply(1:2, function(x) {
nrep <- 1
time <- rep(seq(90,54000,by=90),times=nrep)
Mx <- rep(sort(sample(seq(0.012,-0.014,length.out = 600),replace=TRUE)), times=nrep)
My <- rep(sort(sample(seq(0.02,-0.02,length.out = 600),replace=TRUE)), times=nrep)
Mz <- rep(sort(sample(seq(-1,1,length.out=600),replace=TRUE)), times=nrep)
data.frame(time,Mx,My,Mz,set_nbr=x)
})

这提供了每个数据集的前 5 行

[[1]]
time Mx My Mz set_nbr
1 90 -1.391319e-02 -2.000000e-02 -1.000000000 1
2 180 -1.386978e-02 -1.986644e-02 -1.000000000 1
3 270 -1.386978e-02 -1.973289e-02 -0.996661102 1
4 360 -1.382638e-02 -1.973289e-02 -0.993322204 1
5 450 -1.382638e-02 -1.973289e-02 -0.979966611 1
.. .. .... .... .... ...

[[2]]

time Mx My Mz set_nbr
1 90 -1.395659e-02 -0.0200000000 -1.000000000 2
2 180 -1.391319e-02 -0.0199332220 -0.993322204 2
3 270 -1.386978e-02 -0.0199332220 -0.993322204 2
4 360 -1.386978e-02 -0.0199332220 -0.993322204 2
5 450 -1.382638e-02 -0.0199332220 -0.986644407 2
.. .. .... .... .... ...

编辑1:

关于@bgoldst的回答,现在我可以产生不同的数字

set.seed(1);
data.list <- lapply(1:2, function(x) {
nrep <- 1;
time <- rep(seq(90,54000,by=90),times=nrep);
Mx <- rep(sort(runif(600,-0.014,0.012)),times=nrep);
My <- rep(sort(runif(600,-0.02,0.02)),times=nrep);
Mz <- rep(sort(runif(600,-1,1)),times=nrep);
data.frame(time,Mx,My,Mz,set_nbr=x);
});

另一方面,当我改变nrep <- 3;时为每个 nrep 创建相同的数字。这是我从一开始就想避免的事情。

编辑2:

@bgoldst 表明 replicate完成工作!

最佳答案

我想你可能对如何 sample() 有一些困惑有效。

首先,让我们检查一下 sample() 对于这个简单向量的行为:

1:5;
## [1] 1 2 3 4 5

当您将多元素向量传递给 sample() 时,它基本上只是随机化顺序。这意味着您每次都会得到不同的结果,或者更准确地说,向量越长,两次获得相同结果的可能性就越小:

set.seed(1); sample(1:5); sample(1:5); sample(1:5);
## [1] 2 5 4 3 1
## [1] 5 4 2 3 1
## [1] 2 1 3 4 5

这意味着如果您在采样后立即对其进行排序,那么您每次都会得到相同的结果。如果原始向量本身已排序,那么结果也将等于该原始向量。无论 sample() 如何随机化顺序,这都是正确的,因为顺序总是由 sort() 恢复。 :

set.seed(1); sort(sample(1:5)); sort(sample(1:5)); sort(sample(1:5));
## [1] 1 2 3 4 5
## [1] 1 2 3 4 5
## [1] 1 2 3 4 5

现在,如果您添加 replace=T (或者如果您想利用部分匹配来实现简洁,则只需添加 rep=T ,我就是这样做的),那么您'如果您只是随机化顺序,您将选择带有替换的size元素,其中size是向量长度(如果您没有提供大小明确。这意味着您可以在结果中获得重复的元素:

set.seed(1); sample(1:5,rep=T); sample(1:5,rep=T); sample(1:5,rep=T);
## [1] 2 2 3 5 2
## [1] 5 5 4 4 1
## [1] 2 1 4 2 4

因此,如果对结果进行排序,您(可能)不会得到原始向量,因为某些元素将被重复,而某些元素将被省略:

set.seed(1); sort(sample(1:5,rep=T)); sort(sample(1:5,rep=T)); sort(sample(1:5,rep=T));
## [1] 2 2 2 3 5
## [1] 1 4 4 5 5
## [1] 1 2 2 4 4

这正是您的代码所发生的情况。两个列表组件之间的输出向量不同,因为您在排序之前进行了替换采样,这意味着每个列表组件都会出现不同的元素重复和遗漏。但由于您是从相同的序列中采样并对结果进行排序,因此您必然会获得每个列表组件看起来相似的结果,即使它们并不相同。

我认为您可能正在寻找的是均匀分布的随机偏差。您可以从runif()获取这些:

set.seed(1); runif(5,-0.014,0.012);
## [1] -0.0070967748 -0.0043247786 0.0008941874 0.0096134025 -0.0087562698
set.seed(1); runif(5,-0.02,0.02);
## [1] -0.009379653 -0.005115044 0.002914135 0.016328312 -0.011932723
set.seed(1); runif(5,-1,1);
## [1] -0.4689827 -0.2557522 0.1457067 0.8164156 -0.5966361

因此,您的代码将变为:

set.seed(1);
data.list <- lapply(1:2, function(x) {
nrep <- 1;
time <- rep(seq(90,54000,by=90),times=nrep);
Mx <- rep(sort(runif(600,-0.014,0.012)),times=nrep);
My <- rep(sort(runif(600,-0.02,0.02)),times=nrep);
Mz <- rep(sort(runif(600,-1,1)),times=nrep);
data.frame(time,Mx,My,Mz,set_nbr=x);
});

这给出:

lapply(data.list,head);
## [[1]]
## time Mx My Mz set_nbr
## 1 90 -0.01395224 -0.01994741 -0.9967155 1
## 2 180 -0.01394975 -0.01991923 -0.9933909 1
## 3 270 -0.01378866 -0.01980934 -0.9905714 1
## 4 360 -0.01371306 -0.01977090 -0.9854065 1
## 5 450 -0.01371011 -0.01961713 -0.9850108 1
## 6 540 -0.01365998 -0.01960718 -0.9846628 1
##
## [[2]]
## time Mx My Mz set_nbr
## 1 90 -0.01398426 -0.01997718 -0.9970438 2
## 2 180 -0.01398293 -0.01989651 -0.9931286 2
## 3 270 -0.01397330 -0.01988715 -0.9923425 2
## 4 360 -0.01396455 -0.01957807 -0.9913645 2
## 5 450 -0.01384501 -0.01939597 -0.9892001 2
## 6 540 -0.01382531 -0.01931913 -0.9889356 2

编辑:从你的问题来看,你希望列表组件之间的随机数不同,也就是说,在从 1 生成的组件之间: 2 作为第一个参数传递给 lapply()。每个列表组件内每个随机向量 nrep 次的重复似乎不相关,部分原因是您将 nrep 设置为 1,因此没有任何实际的重复。

但是没关系,我们可以通过使用replicate()而不是rep()来实现这个需求,因为replicate()实际运行每次重复它的表达式参数一次。我们还必须展平结果,因为默认情况下 replicate() 返回一个矩阵,而我们需要一个直向量:

set.seed(1);
data.list <- lapply(1:2, function(x) {
nrep <- 2;
time <- rep(seq(90,54000,by=90),times=nrep);
Mx <- c(replicate(nrep,sort(runif(600,-0.014,0.012))));
My <- c(replicate(nrep,sort(runif(600,-0.02,0.02))));
Mz <- c(replicate(nrep,sort(runif(600,-1,1))));
data.frame(time,Mx,My,Mz,set_nbr=x);
});
lapply(data.list,function(x) x[c(1:6,601:606),]);
## [[1]]
## time Mx My Mz set_nbr
## 1 90 -0.01395224 -0.01993431 -0.9988590 1
## 2 180 -0.01394975 -0.01986782 -0.9948254 1
## 3 270 -0.01378866 -0.01981143 -0.9943576 1
## 4 360 -0.01371306 -0.01970813 -0.9789037 1
## 5 450 -0.01371011 -0.01970022 -0.9697986 1
## 6 540 -0.01365998 -0.01969326 -0.9659567 1
## 601 90 -0.01396582 -0.01997579 -0.9970438 1
## 602 180 -0.01394750 -0.01997375 -0.9931286 1
## 603 270 -0.01387607 -0.01995893 -0.9923425 1
## 604 360 -0.01385108 -0.01994546 -0.9913645 1
## 605 450 -0.01375113 -0.01976155 -0.9892001 1
## 606 540 -0.01374467 -0.01973125 -0.9889356 1
##
## [[2]]
## time Mx My Mz set_nbr
## 1 90 -0.01396979 -0.01999198 -0.9960861 2
## 2 180 -0.01390373 -0.01995219 -0.9945237 2
## 3 270 -0.01390252 -0.01991559 -0.9925640 2
## 4 360 -0.01388905 -0.01978123 -0.9890171 2
## 5 450 -0.01386718 -0.01967644 -0.9835435 2
## 6 540 -0.01384351 -0.01958008 -0.9822988 2
## 601 90 -0.01396739 -0.01989328 -0.9971255 2
## 602 180 -0.01396433 -0.01985785 -0.9954987 2
## 603 270 -0.01390700 -0.01984074 -0.9903196 2
## 604 360 -0.01376890 -0.01982715 -0.9902251 2
## 605 450 -0.01366110 -0.01979802 -0.9829480 2
## 606 540 -0.01364868 -0.01977278 -0.9812671 2

关于r - 如何在具有范围的 data.frame 中生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30637803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com