我目前正在使用apTreeshape使用"Yule-Hardy"方法模拟系统发育树.我想要做的是为三个不同的分组(小型,中型和大型树)随机生成20到25个不同的数字,然后为从分组中选择的每个随机数生成大约40棵树.
我知道如何在Python的Python中做到这一点,但在R中,事情看起来有点不同.
我的想法是,如果我要生成一个充满随机数的向量(每个大小分组一个),然后使用它生成一个基本上包含每个随机数的所有重复值的向量.
这是我有的:
sm_leaves<-c(sample(3:50,25,replace=F));
s_leafy<-numeric();
for (i in 1:length(sm_leaves)) {
for (j in 1:10) {
s_leafy[j+i-1]=sm_leaves[i];
}
}
Run Code Online (Sandbox Code Playgroud)
这给我的输出如下:
> s_leafy
[1] 5 38 6 22 29 20 19 46 9 18 39 50 34 11 43 7 8 32 10 42 14 37
[23] 23 13 28 28 28 28 28 28 28 28 28 28
Run Code Online (Sandbox Code Playgroud)
但我想要的更像是:
> s_leafy
[1] 5 5 5 5 5 5 5 5 5 5 38 38 38 38 38 38 38 38 38 ... 28 28 28 28 28 28 28 28 28 28
Run Code Online (Sandbox Code Playgroud)
我这样做的原因仅仅是我可以将这个向量与所有随机生成的树一起附加到数据框架 - 我需要2000个,所以手动执行这个操作并不太实际.
从我以前尝试解决这个问题的所有我真正能够推断的是,一般来说,应该使用循环而不是for循环,很多人都谈到使用expand.grid,但我不认为后者在这种情况下特别有用.
感谢阅读,我希望我的问题不是太微不足道(虽然我不会感到惊讶).
使用'rep'显然是如何在R中快速完成此任务的答案,但为什么你的代码不起作用?一点调查揭示了原因.
首先,取出随机性并给自己一个简单,可重复的例子.将sm_leaves设置为c(3,4,5),看看会发生什么.你得到:
3 4 5 5 5 5 5 5 5 5 5 5
哪个看起来还不错.你预计10个3s,10个4s,10个5s吧?嗯.在循环中添加一个print语句,以查看值被卡住的位置:
> for (i in 1:length(sm_leaves)) {
for (j in 1:10) {
print(j+i-1)
s_leafy[j+i-1]=sm_leaves[i];
}
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
...etc....
Run Code Online (Sandbox Code Playgroud)
哎呀.你的矢量索引是错误的.j + i-1在每个内循环后跳回并覆盖先前的值.你要:
s_leafy[j + (i - 1)*10]=sm_leaves[i];
Run Code Online (Sandbox Code Playgroud)
所以也许这只是一个简单的例子,你错过了表达式中的*10!
但请注意,很多简单的向量操作最好使用R的函数,如rep,seq和"[",如此处的其他答案中所述.