每个间隔中最大值的实际值

时间:2012-04-30 10:59:25

标签: r

让我们假设

x = c(1, 2, 3.5, 4, 6, 7.5, 8, 9, 10, 11.5, 12) 
y = c(2.5, 6.5) 
I = split(x, findInterval(x, y))
f = function(I$'i', x) {
        d = pmax(outer(x, I$'i', "-"), 0)
        colSums(d - d^2/2)
}

我想在每个区间的每个值中计算f(I $'i',x)的值,然后找出哪个I $'''实际值具有f的最大值(I $'i', x)在每个区间。例如,如果我们有三个区间,我的结果应该是三个x值,其中f(I $'i',x)在每个区间中最大。我怎样才能找到这些价值观? 另外,应该提到的是,在我的代码的每次迭代中,向量y的值都会改变。

我写了这段代码,但是我找不到每个区间中最大值的实际值:

for(i in 0:length(I)-1){
    max.value = I$'i'[which.max(f(I$'i', x))]
}

我收到了这个错误: pmax错误(外(x,I,“ - ”),0):   不能将0长度的矢量与其他人混合

1 个答案:

答案 0 :(得分:0)

问题是尝试索引列表的i元素。执行I$'i'正在尝试获取与不存在的字符串'i'对应的列表元素:

> i <- 1
> I$'i'
NULL

要解决此问题,您应使用[[..]]表示法对其进行索引(按顺序对其进行索引,即I[[1]] = I$'0'):

> i <- 1
> I[[i]]
[1] 1 2
> I$'0' # to illustrate the indexing
[1] 1 2

假设f只是想要一个向量(而不是一个I的索引),它的定义应该是这样的:

f = function(vec, x) {
        d = pmax(outer(x, vec, "-"), 0)
        colSums(d - d^2/2)
}

循环如:

for (i in 1:length(i)) {
     max.value = I[[i]][which.max(f(I[[i]], x))]
}

请注意,您可以直接遍历列表的元素,您不需要单独索引每个元素,所以我们也可以这样做:

for (vec in I) {
     max.value = vec[which.max(f(vec, x))]
}

(另外,您可能需要与您拥有的内容略有不同,因为在每个循环中max.value都会被覆盖。)