2015-09-26 93 views
0

我试图插入两个时间序列之间的超越概率,这里时间并不重要。R插值data.table的列

data1<-c(10,11,12,13,14,15) 
data2<-c(20,21,22,23,24,25) 
x<-c(1,2) 
elevation<-c(10,11,20,24,25) 
elevation<-data.table(elevation) 

其中x [1]是data1的x参数,data1是该位置的值。考虑英里1和英里2.海拔是从data1的最小值到data2的最大值的一个序列。

我想插入英里1.5的所有超越概率。我曾尝试是:

data1prob<-ecdf(data1) 
data2prob<-ecdf(data2) 
elevation[,prob:=1-as.numeric(approx(x = x, y =c(data1prob(elevation),data2prob(elevation)), xout = 1.5)[2])] 

我收到的错误:

Error in .approxfun(x, y, v, method, yleft, yright, f) : (list) object cannot be coerced to type 'double'

这是从呼叫data1prob(elevation)。我相信调用的是高程矢量,而不是每行的单个高程值。 当我做elevation[,prob:=elevation-as.numeric(approx(x = x, y =c(5,6), xout = 1.5)[2])]时我没有任何问题,但是当我尝试elevation[,prob:=data1prob(elevation)]时例如。

感谢任何输入。

+0

硬,要知道,如果我的回答工作,因为你还没有表现出预期的输出。 – Frank

回答

2

我很确定OP只是滥用了approx函数的矢量化。

这工作得很好:

elevation[, prob := mapply(
    function(x,y1,y2) 1 - approx(x = x, y = c(y1,y2), xout = 1.5)[[2]], 
    list(x), 
    ecdf(data1)(elevation), 
    ecdf(data2)(elevation) 
)] 
# elevation  prob 
# 1:  10 0.91666667 
# 2:  11 0.83333333 
# 3:  20 0.41666667 
# 4:  24 0.08333333 
# 5:  25 0.00000000