0

让我们假设

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$'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(outer(x, I, "-"), 0) 中的错误:不能将 0 长度向量与其他向量混合

4

1 回答 1

0

问题是试图索引i列表的第 th 个元素。正在I$'i'尝试获取与 string 对应的列表元素,该元素'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被覆盖。)

于 2012-04-30T11:16:05.753 回答