2015-05-25 2 views
3

У меня есть набор данных, который содержит данные о активности мышц от группы спортсменов, у которых была реконструкция ACL. Я хочу переназначить сторону конечности, чтобы указать конечность ACLR и неповрежденную конечность. Глядя на набор данных под названием EMG ниже, предположим, что у Джона был левый ACLR, а Bob - правый ACLR.изменить значение на основе подмножества другой переменной в dplyr

athlete  limb  EMG_value 
John  left   0.8 
John  right  1.2 
Bob   left   0.5 
Bob   right  0.9 

Я хотел бы набор данных выглядеть следующим образом:

athlete  limb  EMG_value 
John  ACLR   0.8 
John  uninjured 1.2 
Bob   uninjured 0.5 
Bob   ACLR   0.9 

Мой первоначальный план был Подмножество данные по атлета, изменить значение конечности, а затем связать данные обратно в оригинале набор данных.

Отрывок из процесса это выглядит следующим образом:

John = subset(EMG, athlete=="John") 

John$side<- as.character(John$side) 

John$side[John$side=="Left"]="ACLR" 
John$side[John$side=="Right"]="Uninjured" 
John$side = as.factor(John$side) 

Bob = subset(EMG, athlete=="Bob") 

Bob$side<- as.character(Bob$side) 

Bob$side[Bob$side=="Left"]="Uninjured" 
Bob$side[Bob$side=="Right"]="ACLR" 
Bob$side = as.factor(Bob$side) 

EMG2 = rbind(Bob, John) 

Я уверен, что есть способ сделать это быстрее, используя трубопроводы данных в dplyr. Я уверен, что есть способ заменить значение переменной на основе заданного условия.

Логика: если спортсмен == Боб затем заменит левый на ACLR и замените правой на неповрежденный.

Спасибо за любую помощь, которую вы можете предоставить.

Matt

ответ

2

КСТАТИ: логика и пример противоречат: вы говорите, «Боб» и «левый» означает «ACLR», но ваш пример не соглашается с данными. Тем не менее:

library(dplyr) 
## generalizable so you can easily add other patients, etc 
leftAthletes <- c('Bob') 

mutate(acl, limb=ifelse(xor(athlete %in% leftAthletes, limb == 'left'), 
         'uninjured', 'ACLR')) 
## athlete  limb EMG_value 
## 1 John uninjured  0.8 
## 2 John  ACLR  1.2 
## 3  Bob  ACLR  0.5 
## 4  Bob uninjured  0.9 

(Обратите внимание на использование xor ... проверка в ifelse по существу говорит «если в leftAthletes и правой конечности, или не в leftAthletes и левой конечности, а затем невредимым еще ACLR».)

+0

Это отлично поработало - я не знал об илсе и хору. Для меня это был игровой чейнджер. Спасибо, и спасибо за указание на ошибку в последней части моего вопроса. Отличное решение. –

+0

Caveat emptor: 'ifelse' не является идеальным решением для всего и имеет известные проблемы с производительностью. @hadley [обсуждал некоторые проблемы с производительностью с 'ifelse'] (http://adv-r.had.co.nz/Performance.html), но когда скорость не вызывает беспокойства, я считаю ее относительно« элегантной »и очень удобочитаемый. – r2evans