gpt4 book ai didi

r - R 中的嵌套 for 循环有问题

转载 作者:行者123 更新时间:2023-12-02 06:24:01 25 4
gpt4 key购买 nike

我目前正在使用 apTreeshape 使用“Yule-Hardy”方法模拟系统发育树。我想要做的是为三个不同的分组(小型、中型和大型树)随机生成 20 到 25 个不同的数字,然后为从分组中选择的每个随机数生成大约 40 棵树。

我知道如何在 Python 或 Matlab 中执行此操作,但在 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];
}
}

这给我的输出如下:

> 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

但我想要的更像是:

> 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

我这样做的原因仅仅是为了我可以将这个向量连同所有随机生成的树一起附加到一个数据框中——我需要 2000 棵树,所以手动这样做不太实用。

从我以前解决这个问题的尝试中,我真正能够推断出的是,一般来说应该使用 while 循环而不是 for 循环,而且很多人都在谈论使用 expand.grid,但我不认为后者在这种情况下特别有用。

感谢阅读,我希望我的问题不是太微不足道(尽管如果是微不足道我也不会感到惊讶)。

最佳答案

使用“rep”显然是如何在 R 中快速执行此操作的答案,但为什么您的代码不起作用?稍作调查即可揭示原因。

首先,去掉随机性,给自己一个简单的、可重现的例子。将 sm_leaves 设置为 c(3,4,5),看看会发生什么。你得到:

3 4 5 5 5 5 5 5 5 5 5 5

这看起来还是不对。您期望十个 3、十个 4、十个 5,对吗?嗯。将打印语句添加到循环中以查看值被卡在何处:

> 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....

糟糕。你的向量索引是错误的。 j+i-1 在每个内部循环之后跳回并覆盖之前的值。你想要:

s_leafy[j + (i - 1)*10]=sm_leaves[i];

所以也许这只是您在表达式中缺少 *10 的简单情况!

但是请注意,许多简单的矢量操作最好使用 R 的函数来完成,例如 rep、seq 和“[”,如此处其他答案中所述。

关于r - R 中的嵌套 for 循环有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3955878/

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