R中的另一个嵌套循环

时间:2012-03-29 02:35:41

标签: r

我有以下数据并嵌套for循环:

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的相同值,其中&lt; - 20但不是&lt; - 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

2 个答案:

答案 0 :(得分: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) ] )
}

答案 1 :(得分: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