2013-06-13 4 views
2

У меня есть следующая таблица (5 столбцов и 3 строк) называется коврик:Логические операторы, если-то еще в R

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

операция выполняется в mat[1]/mat[1]+mat[2]

Я проверяю для следующих целей: 1) Если оба столбца строки равны нулю, результат должен быть NA. 2) Если только один столбец строки равен нулю, а другой имеет ненулевое число, приступайте к вычислению. (Даже если числитель 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

Смежные вопросы