我使用函数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)]
答案 0 :(得分:5)
我认为您正在使用approx
方法寻找constant
:
approx(x=df$y,y=df$x,xout=val,method="constant",yright=nrow(df)-1,yleft=1)$y
对于区间之外的行为,请检查yleft
和yright
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)]