我有以下数据并嵌套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
答案 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