这里是输入数据和我的期望(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。我不明白这个错误。
答案 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