2013-11-25 2 views
1

У меня есть кадр данных, как это:R - Отсутствующие значения и логические операции

ID VarA VarB 
001 5  2 
002   4 
003 6 
004  
005 3  5 

Я хочу, чтобы создать третью переменную VarC с наибольшими значениями между VarA и VarB:

ID VarA VarB VarC 
001 5  2  5 
002   4  4 
003 6    6 
004     
005 3  5  5 

I знайте, что это должно быть довольно просто. Я пробовал с функцией ifelse, но я получаю только то, что, когда VarA или VarB отсутствует, также отсутствует VarC.

Как я могу решить проблему?

спасибо.

ответ

5

Использование векторизованной pmax и установка na.rm ИСТИНЫ:

with(myData,pmax(VarA,VarB,na.rm=TRUE)) 
1] 5 4 6 NA 5 
+0

Красивых, спасибо – corrado

1

Вам нужно всего лишь использовать ?max с аргументом na.rm=TRUE.

> myData <- read.table(text="ID VarA VarB 
+ 001 5  2 
+ 002 NA  4 
+ 003 6  NA 
+ 004 NA  NA 
+ 005 3  5", header=TRUE) 
> myData$VarC <- apply(X=myData[,-1], MARGIN=1, FUN=max, na.rm=TRUE) 
Warning message: 
In FUN(newX[, i], ...) : no non-missing arguments to max; returning -Inf 
> myData 
    ID VarA VarB VarC 
1 1 5 2 5 
2 2 NA 4 4 
3 3 6 NA 6 
4 4 NA NA -Inf 
5 5 3 5 5 

Обратите внимание, что строка 4 выдает предупреждение, потому что нет не пропущенных данных. Вы можете переписать -InfNA, если хотите.

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