2012-03-29 25 views
1

另一個嵌套循環我有嵌套for循環的下列數據和:中的R

x <- c(12, 27, 21, 16, 12, 21, 18, 16, 20, 23, 21, 10, 15, 26, 21, 22, 22, 19, 26, 26) 
y <- c(8, 10, 7, 7, 9, 5, 7, 7, 10, 4, 10, 3, 9, 6, 4, 2, 4, 2, 3, 6) 

a <- c(20,25) 
a.sub <- c() 
df <- c() 
for(j in 1:length(a)){ 
    a.sub <- which(x >= a[j]) 
    for(i in 1:length(a.sub)){ 
     df[i] <- y[a.sub[i]]  
    } 
    print(df) 
} 

我想環路爲返回值DF爲:

[1] 10 6 3 6 4 10 6 4 2 4 3 6 
[1] 10 6 3 6 

正如我有它,然而,循環返回相同的數值兩次DF的一個< - 20,但不是< - 25:

[1] 10 7 5 10 4 10 6 4 2 4 3 6 
[1] 10 6 3 6 4 10 6 4 2 4 3 6 
+0

'誤差,其中(P> = A [j]):對象「P」不是found' – Chase 2012-03-29 02:38:52

+2

也許解釋什麼是你正在嘗試用英語做, R中的嵌套循環通常可以使用其他更高效的構造來重寫 – Chase 2012-03-29 02:39:42

+0

謝謝,修復了上述錯誤。 'dur'定義爲 – srmulcahy 2012-03-29 02:41:49

回答

1
for(i in 1:length(a.sub)){ 
    df[i] <- y[a.sub[i]]  
} 

可以成爲

df <- y[a.sub]  

既不a.sub也不DF需要被然後,因此預定義......

x <- c(12, 27, 21, 16, 12, 21, 18, 16, 20, 23, 21, 10, 15, 26, 21, 22, 22, 19, 26, 26) 
y <- c(8, 10, 7, 7, 9, 5, 7, 7, 10, 4, 10, 3, 9, 6, 4, 2, 4, 2, 3, 6) 

a <- c(20,25) 
for(j in 1:length(a)){ 
    a.sub <- which(x >= a[j]) 
    df <- y[a.sub]  
    print(df) 
} 

它可以作出短。無論如何,如果你只是打印y的子集,df是不必要的。只需直接打印即可。選擇器非常短,不會讓單線混淆。此外,爲什麼使用a和index的長度..直接循環。因此,它可能是......

a <- c(20,25) 
for(ax in a){ 
    print(y[ which(x >= ax) ]) 
} 
+0

但我不認爲這是回報:[1] 10 6 3 6 4 10 6 4 2 4 3 6 – 2012-03-29 03:12:43

+0

我同意..但它簡化了他的代碼並複製了實際做了什麼......也許他可以讓它做到他現在正在尋找的是它更容易。 :) – John 2012-03-29 03:15:41

0

不知道這是一個更復雜問題的簡化版本,但我可能會使用一些直接索引和應用函數來解決這個問題。事情是這樣的:

z <- cbind(x,y) 
sapply(c(20,25), function(x) z[z[, 1] >= x, 2]) 
[[1]] 
[1] 10 7 5 10 4 10 6 4 2 4 3 6 

[[2]] 
[1] 10 6 3 6 
+0

不知怎的,原始海報想要:10 6 3 6 4 10 6 4 2 4 3 6第一次通過第二次循環。 – 2012-03-29 03:07:39

+0

爲什麼要打擾cbind?他們可以被視爲單獨的載體。 – John 2012-03-29 03:12:55

+0

@John - 好點,我猜想生物的習慣?如果對象是完全獨立的實體,或者被工作空間中的其他命令損壞,我對這些對象的排序會產生這種(非理性)的恐懼......我也可能運行'rm(x,y)'在創建'z'之後不要讓自己混淆......但是這可能是過度的,並且沒有必要,正如你指出的那樣。 – Chase 2012-03-29 12:29:51