[英]Having an issue with nested for loops in R
我目前正在使用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];
}
}
這給我的輸出如下:
> 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個,所以手動執行這個操作並不太實際。
從我以前嘗試解決這個問題的所有我真正能夠推斷的是,一般來說,應該使用循環而不是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....
哎呀。 你的矢量索引是錯誤的。 j + i-1在每個內循環后跳回並覆蓋先前的值。 你要:
s_leafy[j + (i - 1)*10]=sm_leaves[i];
所以也許這只是一個簡單的例子,你錯過了表達式中的* 10!
但請注意,很多簡單的向量操作最好使用R的函數,如rep,seq和“[”,如此處的其他答案中所述。
如果我不太明白這個問題,請道歉,但是:
sm_leaves <- sample(3:50, 25, replace=FALSE)
s_leafy <- rep(sm_leaves, each=10)
你想要rep()
與each=10
選項:
> set.seed(42)
> sm_leaves <- sample(3:50,25,replace=F)
> s_leafy <- rep(sm_leaves, each=3) ## here rep=3 to generate small sample
> s_leafy
[1] 46 46 46 47 47 47 16 16 16 40 40 40 31 31 31 25 25
[18] 25 33 33 33 8 8 8 29 29 29 30 30 30 20 20 20 42
[35] 42 42 36 36 36 11 11 11 18 18 18 34 34 34 35 35 35
[52] 6 6 6 17 17 17 19 19 19 28 28 28 44 44 44 41 41
[69] 41 26 26 26 4 4 4
>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.