2011-03-27 5 views
1

먼저 샘플 데이터 : 목표는 추측과 같은 번호가 그 다음이다계산 점수

bbbv[1:25] <-1 
bbbv[26:50] <-2 
bbbw <- 1:25 
bbbx <- sample(1:5, 50, replace=TRUE) 
bbby <- sample(1:5, 50, replace=TRUE) 

bbb <- data.frame(pnum=bbbv, trialnum=bbbw, guess=bbbx, target=bbby) 

경우 우리가 1 점을, 다른 0

bbb$hit <- ifelse(bbb$guess==bbb$target, 1, 0) 

enter image description here

이를 문제 야. 열을 네 개 더 계산하고 싶습니다.

bbb$hitpone trialnum(n) guess == trial(n+1) target 
bbb$hitptwo trialnum(n) guess == trial(n+2) target 
bbb$hitmone trialnum(n) guess == trial(n-1) target 
bbb$hitmtwo trialnum(n) guess == trial(n-2) target 

명확해야합니다. 히트 몬의 경우 우리는 재판 추측을보고이를 재판의 목표와 비교하기 전에 (현재 재판에서 -1). hitmtwo에 대해 우리는 재판 추측을보고 그것을 목표 2 (현재 재판에서 -2)와 비교합니다. hitpone과 hitptwo는 동일하지만 긍정적 인 방향 (현재 재판에서 +1과 +2)입니다.

그리고 목표가 추측과 동일한 경우 우리는 1을, 그 외에는 0 (우리의 새로운 계산에 따라)을 결정하는 데 관심이 있습니다.

이제이 작업에는 약간의 어려움이 있습니다. 각 pnum에는 25 개의 재판이 있습니다. 히트 포닉의 경우 25 회 +1을 계산할 수 없습니다. 25 회 또는 24 회 트라이얼에 대해 +2를 계산할 수 없습니다. 트라이얼 1에 대해서는 -1을, 1 회에 대해서는 -2를 계산할 수 없습니다. 2.

이렇게하면 테이블이 보이게됩니다. 저는 처음으로 1-3 번의 시련과 23-25 ​​번의 시련을 보여 주면서 손으로 조롱했습니다. 여기 Wanted output

dput(bbb) 
structure(list(pnum = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), trialnum = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 
18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L), guess = c(5L, 1L, 1L, 
3L, 1L, 3L, 1L, 5L, 2L, 3L, 1L, 1L, 5L, 3L, 5L, 1L, 2L, 2L, 3L, 
1L, 4L, 1L, 4L, 4L, 3L, 4L, 5L, 2L, 4L, 5L, 5L, 5L, 4L, 5L, 2L, 
3L, 1L, 1L, 5L, 1L, 1L, 3L, 1L, 2L, 4L, 1L, 2L, 3L, 1L, 1L), 
target = c(4L, 3L, 4L, 5L, 5L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 
1L, 2L, 5L, 1L, 3L, 2L, 1L, 4L, 4L, 1L, 1L, 3L, 4L, 4L, 2L, 
3L, 2L, 1L, 1L, 5L, 4L, 3L, 5L, 1L, 1L, 1L, 2L, 5L, 2L, 4L, 
3L, 1L, 1L, 2L, 5L, 3L, 3L, 3L), hit = c(0, 0, 0, 0, 0, 0, 
1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 
1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0)), .Names = c("pnum", "trialnum", "guess", 
"target", "hit"), row.names = c(NA, -50L), class = "data.frame") 
+0

우리는 쉽게 재현 할 수 있도록 출력 (bbb)을 표시하고 출력하십시오. 또한, 당신의 의사 코드가 무엇을 원하는지에 대한 내게 불분명하다. 어쩌면 특정 항목을 어떻게 원하는지 단어로 입력 할 수 있습니다. 명중 된 계산? –

답변

1

은 기본이다. 이 값을 늘려 음수 증가분을 처리하고 by()을 사용하면 서브 셋팅을 피하기 위해 hitp()으로 전화를 걸 수 있습니다.

hitp <- function(dtf,inc) { 
    target.shift <- shift(dtf$target,inc,wrap=FALSE,pad=TRUE) 
    return(dtf$guess==target.shift) 
} 
bbb1 <- subset(bbb,pnum==1) 
bbb1$hitpone <- hitp(bbb1,1) 
bbb1$hitptwo <- hitp(bbb1,2) 
bbb1$hitmone <- hitp(bbb1,-1) 

전화 같이 보일 것이다 의해 : shift 내가 다른 용도로 쓴 프로그램입니다

unlist(by(bbb,bbb$pnum,hitp,inc=1)) 

:이 모든 적절한 분류에 매우 크게 의존

shift <- function(vec,n=1,wrap=TRUE,pad=FALSE) { 
    if(length(vec)<abs(n)) { 
     #stop("Length of vector must be greater than the magnitude of n \n") 
    } 
    if(n==0) { 
     return(vec) 
    } else if(length(vec)==n) { 
     # return empty 
     length(vec) <- 0 
     return(vec) 
    } else if(n>0) { 
     returnvec <- vec[seq(n+1,length(vec))] 
     if(wrap) { 
      returnvec <- c(returnvec,vec[seq(n)]) 
     } else if(pad) { 
      returnvec <- c(returnvec,rep(NA,n)) 
     } 
    } else if(n<0) { 
     returnvec <- vec[seq(1,length(vec)-abs(n))] 
     if(wrap) { 
      returnvec <- c(vec[seq(length(vec)-abs(n)+1,length(vec))], returnvec) 
     } else if(pad) { 
      returnvec <- c(rep(NA,abs(n)), returnvec) 
     } 

    } 
    return(returnvec) 
} 

는, 실행하기 전에 정렬되어 있는지 확인하십시오.

+0

감사합니다. @ gsk3. 그것은 내 기술을 위해 약간 고급이지만, 나는 그것을 가졌다. 모든 pnum에 대해'bbb1 <- subset (bbb, pnum == 1)'을 실행해야합니까? 아니면 비공개가 그들 모두에 대해 계산합니까? 나는 잘 모르겠다. –

+1

@Rsoul : 하위 설정은 간단하기 때문에 약간 두건을 들여다 볼 수 있습니다. 'by (bbb, bbb $ pnum, hitp, inc = 1)'은 각 pnum에서이를 실행합니다. unlist는 bbb에 다시 삽입 할 수있는 양식으로 되돌립니다. 그래서'bbb $ hitpone <- unlist (by (bbb, bbb $ pnum, hitp, inc = 1))'은 당신이 원하는 것을해야합니다. '교대'의 세부 사항에 모든 것이 흐려지지 않도록하십시오. 근본적으로 벡터가 증분에 의해 이동합니다. 코드 복사/붙여 넣기를 통해 R에로드하는 블랙 박스라고 생각해보십시오. 'hitp()'를 이해하도록 노력하십시오. –

+0

아. 도움이됩니다. 그래서 암시 적 증가분을 얻는 방법에 대한 암시가 있습니까? :) –