2013-06-13 2 views
2

의 :논리 연산자에서 I (5 열과 3 행)라고 매트 다음 표가있는 경우 - 다른 R

AC CA RES 
1 0 
2 2 
1 3 
0 0 
0 1 

수행되는 작업은 I에서는 다음과 같은 사항에 대해 테스트입니다 mat[1]/mat[1]+mat[2]

입니다 : 1) 행의 두 열이 모두 0이면 결과는 NA 여야합니다. 2) 한 열의 열이 0이고 다른 열의 수가 0이 아닌 경우 계산을 계속합니다. 나는 현재 내이 경우 - 다른 구조를 사용하고

(분자가 0 인 경우에도, 괜찮아요)를위한 루프 행 방향으로가는 :

if(mat[b,1]>=0|mat[b,2]>=0){mat[b,3]<-(mat[b,1]/(mat[b,1]+mat[b,2]));} 
else{is.na(mat[b,3])=TRUE;} 

내가받을 다음과 같은 오류 :

1: In Ops.factor(mat[b, 1], 0) : >= not meaningful for factors 
2: In Ops.factor(mat[b, 2], 0) : >= not meaningful for factors 

더 부드러운 방법이 있습니까?

숫자는 항상 정수이며 항상 0 이상입니다. apply을 사용하고 싶습니다만 어떻게 apply의 결과를 3 번째 열에 직접 할당합니까?

답변

2

결과를 얻으려면 for 루프가 필요하지 않습니다. 단지 ifelse()을 사용하십시오. 데이터 프레임 mat의 열이 숫자가 아닌 경우 (의견에서 @Arun으로 지적한대로)이 작업이 가능합니다.

mat$RES<-ifelse(mat[,1]==0 & mat[,2]==0,NA,mat[,1]/(mat[,1]+mat[,2])) 

mat 
    AC CA RES 
1 1 0 1.00 
2 2 2 0.50 
3 1 3 0.25 
4 0 0 NA 
5 0 1 0.00 
+1

그래도 오류는 아닙니다. 당신은해야 할 것이다 :'mat [] <- lapply (mat, function (x) as.numeric (as.character (x)))' – Arun

+0

두 답을 함께 쓰면 매력처럼 작동합니다. 둘 다 감사합니다 :) – user2211355