2013-07-01 3 views
0

수천 개의 행과 세 개의 다른 열이있는 배열이 r 개 있습니다. 배열의 각 행에 대해 첫 번째 열과 세 번째 열을 기준으로 첫 번째 열을 변경하려고합니다. 특히 세 번째 열의 숫자가 첫 번째 열의 숫자보다 큰 경우 1을 반환하고 세 번째 열의 숫자가 첫 번째 열의 숫자보다 작은 경우 숫자가 0 인 경우이를 반환해야합니다. 이 무작위로 선택해야 같은 수는 1다른 열을 사용하여 함수 적용 -

temp[,1]<- sapply(
         temp[,1], 
         function(score){ 
          if(temp[,3]>score){1} 
          else if(temp[,3]<score){0}else 
          else if(temp[,3]==score){sample(0:1,1)}}) 

이 0 내가 지금까지 가지고있는 코드입니다하지만 "온도가 [3]"그것은을 반환 호출 할 때, 나는 생각을 확실히 작동하지 않습니다 세 번째 열의 모든 행 벡터, 난 그저 "점수"와 함께 얻을 행에 해당하는 한 항목을 원한다.

답변

2

사용 ifelse :

ifelse(temp[,1] < temp[,3], 1, # test condition 1, give 1 if TRUE 
     ifelse(temp[,1] > temp[,3], 0, # condition 1 is FALSE, test condition 2 
       rbinom(dim(temp)[1],1,.5))) # condition 2 is FALSE, return random 

편집 : 다음 조건을 테스트가 FALSE 경우 해당 조건이 TRUE 또는 뭔가 다른 경우 뭔가를 수행하여 ifelse 작품. 세 가지 조건이 있으므로 첫 번째 조건 (temp[,1] < temp[,3])이 FALSE 일 때 값을 제공하는 대신 두 번째 조건 인 (temp[,1] > temp[,3])을 테스트하는 두 번째 ifelse 문을 제공합니다.

나머지 모든 경우는 rbinom을 사용하여 임의로 생성됩니다. 조건 1과 조건 2를 충족시키지 않는 모든 행에 동일한 무작위 추출이 주어지기 때문에 이것은 그리기보다는 벡터가되어야합니다. 시도한 경우 :

ifelse(temp[,1]<temp[,3],1,ifelse(temp[,1]>temp[,3],0,rbinom(1,1,.5))) 

temp[,1]==temp[,3]의 값이 같은 모든 행이 표시됩니다. 그냥 같은 일을하고 같은 것 :

이 또한 조건문 대신 연산을 사용하여 수행 할 수 있습니다
ifelse(temp[,1]<temp[,3],1,ifelse(temp[,1]>temp[,3],0,2)) 
+0

. 왜 두 번째 ifelse가 첫 번째 ifelse의 안에 포함되어 있는지 설명해 주시겠습니까? 왜 rbinom (dim (temp) [1])을합니까? 나는 당신이 가지고있는 각 행마다 난수를 얻는다는 것을 의미한다고 생각합니까? – appleLover

+0

몇 가지 추가 설명과 함께 업데이트되었습니다. – Thomas

+0

아, 알겠습니다. 내가 목록을 통해 반복 하여이 물건을 해결하는 데 사용하는 파이썬에서 왔어. 나는 벡터가 더 잘 작동하는 방식을 좋아합니다. 대답 수락 – appleLover

4

:

난 그냥 완벽 작동이 코드를 시도 토마스
rbinom(nrow(temp), 1, (temp[,1]<temp[,3])+(temp[,1]==temp[,3])*0.5) 
+0

+1 아주 좋은 대답. – Thomas

+0

영리한 대답 :) – appleLover