使用if语句错误消息嵌套for循环

时间:2015-11-03 16:49:00

标签: r if-statement for-loop

这里是输入数据和我的期望(y)。

# input:
mydf <- data.frame(matrix(1:10, ncol = 2))
x=c(1.5, 2.8, 4.1)
y=c(0, 0, 0)
mydf
x
y

# code
for (i in 1:(length(x))
    for (j in 2:(dim(mydf)[1])
    {{
        if (x[i])>mydf[(j-1),1]) & (x[i])<mydf[j,1]) 
            {y[i]<-mydf[(j-1),2]} 
        else {y[i]<-9999999999}
    }}
y

对y的期望:6,7,9。我不明白这个错误。

1 个答案:

答案 0 :(得分:1)

这是一个可以工作并提供预期输出的代码:

for (i in 1:length(x)) {
    for (j in 2:nrow(mydf)) {
        if (mydf[j-1,1] < x[i] & x[i] < mydf[j,1]) {
            y[i] <- mydf[j-1,2]    
            break
        } else {y[i]<-9999999999}
    }
}

y

[1] 6 7 9

您需要添加break,否则j将保持循环并返回9999999999.

更优雅的选择是:

x=c(1.5, 2.8, 4.1,11)
mydf[nrow(mydf),2]<-999999 # y can't be equal to the lower right cell, so I transform it
y<-mydf[findInterval(x,mydf[,1]),2]
y

y
[1]      6      7      9 999999

另一种解决方案是这样(最好是某些值将返回9999):

x<-c(-3,1.5, 2.8, 4.1,11)
temp<-sapply(x,function(z){z>mydf[,1]&z<mydf[-1,1]})
temp2<-sapply(seq_along(x),function(z){match(TRUE,temp[,z])})
y<-mydf[temp2,2]
y[is.na(y)]<-9999
y

[1] 9999    6    7    9 9999