2013-08-01 2 views
0

У меня есть подобный, но не совсем такой же вопрос R apply function with multiple parametersR - sapply функции с несколькими аргументами

У меня есть набор данных с двумя переменными RSHIFTSTART и RSHIFTEND (среди других переменных). Эти переменные содержат время, например. 23:30:00 или 00:00:00. Я бы хотел заменить RSHIFTSTART и RSHIFTEND на NA везде, где BOTH-переменные равны нулю, т.е. '00: 00: 00' .

Я написал функцию, которая, я думаю, может сделать работу:

# Change '00:00:00' to NA where both variables are '00:00:00' 
zeroTime=function(x,y) { 
    if (x=='00:00:00' & y=='00:00:00') { 
     replace(x,x=='00:00:00',NA) 
     replace(y,x=='00:00:00',NA) 
    } 
} 

Мой вопрос заключается в том, как применять эту функцию для обновления переменных т.е. набора данных. снабжая два аргумента. Я пробовал:

sapply(rosterSample$RSHIFTSTART,rosterSample$RSHIFTEND,zeroTime) 

, но этот синтаксис неверен. Возможно, мне будет запрещено изменять только одну переменную за вызов, т. Е. RSHIFTSTART или RSHIFTEND, все в порядке.

Любые идеи? Thanks Pete

+1

как о 'mapply': "mapply является многомерной версией sapply" – shadow

+0

' sapply' или 'mapply' не правильный подход здесь. R использует * pass-by-value *, а не * pass-by-reference *. Это означает, что 'zeroTime' не изменяет свои аргументы' x' и 'y' вне области действия функции. @ Ответ Карла - правильный подход. – flodel

+0

Спасибо flodel, это имеет смысл, если функции просто передаются по значению и должны возвращать обновленную переменную. Томас тоже благодарен за это - я не видел этого вопроса в своих поисках. – Pete855217

ответ

4

Что-то вроде этого?

rosterSample <- data.frame(RSHIFTSTART=c('00:00:00', '01:00:00', '00:00:00'), RSHIFTEND=c('10:00:00', '00:00:00', '00:00:00'), stringsAsFactors=FALSE) 
ind <- with(rosterSample, RSHIFTSTART=='00:00:00' & RSHIFTEND=='00:00:00') 
rosterSample$RSHIFTSTART[ind] <- NA 
rosterSample$RSHIFTEND[ind] <- NA 
+0

Спасибо Карлу - это должно сделать трюк. Спасибо за образец кода тоже, очень ценится. – Pete855217