函数findInterval的替代方案

时间:2015-01-27 12:14:23

标签: r

我使用函数findInterval来定位同一行中另一个变量的位置。

示例:

set.seed(123)
df <- data.frame(x=seq(1,10,1),y=rnorm(10,1))
val <- 0.5

df$x[findInterval(val,df$y, all.inside=TRUE)]

这会给出错误,矢量必须非递减地排序

还有其他选择吗?我的列数很少,来回翻转列并不是那么方便。

当然重新订购所有作品:

ordered.df <-df[order(df[ ,"y"], decreasing=FALSE), ]

ordered.df$x[findInterval(val,ordered.df$y, all.inside=TRUE)]

3 个答案:

答案 0 :(得分:5)

我认为您正在使用approx方法寻找constant

approx(x=df$y,y=df$x,xout=val,method="constant",yright=nrow(df)-1,yleft=1)$y

对于区间之外的行为,请检查yleftyright args。

答案 1 :(得分:3)

我认为你真的想要滚动加入。如果没有排序,这是无法有效完成的。

set.seed(123)
df <- data.frame(x=seq(1,10,1),y=rnorm(10,1))
val <- 0.5

library(data.table)
DT <- data.table(df)
setkey(DT, y)
#     x          y
# 1:  8 -0.2650612
# 2:  9  0.3131471
# 3:  1  0.4395244
# 4: 10  0.5543380
# 5:  2  0.7698225
# 6:  4  1.0705084
# 7:  5  1.1292877
# 8:  7  1.4609162
# 9:  3  2.5587083
#10:  6  2.7150650

DT[.(val), roll = "nearest"]
#    x   y
#1: 10 0.5

答案 2 :(得分:0)

尝试which.min

df$x[which.min(abs(val - dt$y)]