2012-04-30 3 views
0

내가 F 값 (I 달러 '나'X) 각 각 간격의 값에서 발견을 계산할실제 값

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) 
} 

가정하자 이는 I $ 'i'실제 값은 각 간격에서 f (I $ 'i', x)의 최대 값을가집니다. 예를 들어 우리가 3 개의 간격을 가지고 있다면, 결과는 각 간격에서 최대 인 f (I $ 'i', x)의 세 값이되어야합니다. 이 값들을 어떻게 찾을 수 있습니까? 또한, 내 코드 반복마다 벡터 y의 값이 변경된다는 점을 언급해야합니다.

나는이 코드를 작성하지만 각 간격의 최대 값의 실제 값을 찾을 수 없습니다 :

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

그리고 난이 오류가있어 ", I, (외부 (X를 PMAX에 오류 - "), 0) : 길이가 0 인 벡터를 다른 문자와 섞을 수 없습니다.

+0

의 정의 'f'는 R에서 작동하지 않습니다. R에 들어가는 것이 확실합니까? – huon

+1

나는 '나는 $'나는 '구문 오류라고 확신한다. 숫자 'i'를 문자열로 변환하려면 (예 :'i <- 0; 나는 [[i]]'. 이것은 I $ '0' '을하는 것과 같지만 좀 덜 이상하고'i'는 변수가 될 수 있습니다. –

+1

'0 : length (I) -1'은 약간 다른 주석으로'0 : length (I) -1' ='[1] -1 0 1 2'의 출력을 기대하지 않습니다. R이 의도 한 조작 순서를 알 수 있도록 대괄호를 써야합니다.'0 : (length (I) -1)'='[1] 0 1 2' – huon

답변

0

문제는 목록의 i 번째 요소를 색인하려고합니다. 당신이 인덱스 색인을 순서대로 [[..]] 표기법을 사용하여 목록을 (해야,

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

는이 문제를 해결하려면 다음을 수행 I$'i' 존재하지 않는 문자열 'i'에 해당하는 목록의 요소를 얻기 위해 노력하고있다 즉 I[[1]] = I$'0') :

, 그 정의는 같은 것을해야한다) f 그냥 벡터 (보다는 I에 대한 인덱스를 취할 의미한다고 가정
> i <- 1 
> I[[i]] 
[1] 1 2 
> I$'0' # to illustrate the indexing 
[1] 1 2 

:

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을 덮어되기 때문에, 당신은 당신이 무엇을 약간 다른 무언가를 할 수 있습니다.)

+0

당신의 도움에 감사드립니다. –

+0

@ BensorBeny이 답변으로 질문이 해결되면 옆에있는 체크 표시의 개요를 클릭하여 "수락"으로 표시해야합니다. (당신은 당신의 다른 질문들에 대해서도 그렇게해야합니다.) – huon

관련 문제