让我们假设
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长度的矢量与其他人混合
答案 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
都会被覆盖。)