2009-09-08 6 views
3

두 개의 벡터, subjecttarget이 있습니다. 두 개의 기존 벡터 사이의 비교를 기반으로 새로운 벡터를 만들고 싶습니다. 요소는 lagged과 비교됩니다. 아래의 루프를 사용하여이 문제를 해결했지만 실제로는 더 우아한 솔루션이 있는지 궁금합니다. apply?두 벡터의 요소를 비교하는 "lagged"기반의 새 벡터?

subject <- c(200,195,190,185,185,185,188,189,195,200,210,210) 
target <- c(subject[1],subject[1]-cumsum(rep(perweek,length(subject)-1))) 
adjtarget <- target            

for (i in 1:(length(subject)-1)) { 
    if (subject[i] > adjtarget[i]) {     
    adjtarget[i+1] <- adjtarget[i]   
    } else {          
    adjtarget[i+1] <- adjtarget[i]-perweek } 
    } 
} 
+0

주회 변수의 값은 무엇입니까? –

+0

안녕하십니까 죄송합니다. 주일은 정수입니다. 필자의 경우, 주일 <-02 – Marianne

+0

코드는 이해하기가 약간 까다 롭습니다. 루프에서 할당은 다음 반복에서 비교할 장소에서 'adjtarget'을 변경합니다. 일반적으로 전체 벡터를 병렬로 작업하는 R에서 이것을 표현하는 훌륭한 해결책은 없습니다. 비교 대상이 움직이는 대상입니다. –

답변

1

이것은 정확하게 문제를 해결하지는 않지만 도움이되는 방향을 제시 할 수 있습니다. 나는 adjtarget을 바꾸는 것 사이의 상호 작용을 무시하고, 비슷한 문제를 보여줍니다. 여기서 우리는 상수 target과 비교합니다. 그 다음은 벡터 비교에 루프에서 if을 변경하는 것이 가능하다 :

lv <- but.last(subject) > but.last(target) 
ind <- which(lv) 

이 결과 벡터를 준비 시프트로 (그것이 당신의 adjtarget 같은 결과되지 않습니다로서 나는, x를 호출합니다) target의 복사 및 그것에 변경 사항을 지정 : 또는

x <- c(target[1], but.last(target)) # corresponds to the true branch of the `if` 
x[ind+1] <- target[ind] - perweek # corresponds to the false branch 

,

x <- c(target[1], but.last(target) - (!lv)*perweek 

내가 말했듯이,이 졸을하지 않습니다 문제가 생겼을 지 모르지만 여기서부터 시작할 수 있습니다. 난 당신의 코드를 이해하면

1

그냥 설명을 위해, 이것은 당신이 ... 내가 옳다 경우

> (goal <- cbind(subject,target,adjtarget)) 

     subject target adjtarget 
[1,]  200 200  200 
[2,]  195 198  198 
[3,]  190 196  196 
[4,]  185 194  194 
[5,]  185 192  192 
[6,]  185 190  190 
[7,]  188 188  188 
[8,]  189 186  186 
[9,]  195 184  186 
[10,]  200 182  186 
[11,]  210 180  186 
[12,]  210 178  186 

는,이를 벡터화에 문제가 반복 찾고있는 결과의 종류 adjtarget에서 186의 배정. 벡터화 된 코드는 왼쪽 (LHS)에 할당하기 전에 오른쪽 (RHS)을 평가합니다. 따라서 벡터화 된 코드는 할당이 완료 될 때까지 행 9에서 adjtarget의 업데이트 된 값을 보지 않습니다.

> y <- ifelse(subject > target, 1, 0) # matches TRUE case 
> x <- target 
> x[ind+1] <- target[ind] 
> cbind(goal, x, y) 
     subject target adjtarget x y 
[1,]  200 200  200 200 0 
[2,]  195 198  198 198 0 
[3,]  190 196  196 196 0 
[4,]  185 194  194 194 0 
[5,]  185 192  192 192 0 
[6,]  185 190  190 190 0 
[7,]  188 188  188 188 0 
[8,]  189 186  186 186 1 
[9,]  195 184  186 186 1 # assigned correctly (?) 
[10,]  200 182  186 184 1 # incorrect x; should be 186 
[11,]  210 180  186 182 1 # incorrect x; should be 186 
[12,]  210 178  186 180 1 # incorrect x; should be 186 
관련 문제