2016-03-29 3 views
0

У меня есть фрейм данных с переменной переменной, представляющей знак важности. Он имеет 50 уровней. Но многие уровни повторяются. Например: «Частота дыхания» может быть закодирована как «Частота ответа» или «RR» и т. Д. Я хотел бы сгруппировать все показатели дыхания на один уровень и сделать то же самое для других жизненно важных признаков. Я попробовал метод ниже. Есть лучший способ сделать это?Символьные переменные бина в R

Sign_desc <- c("Resp rate:","Respiratory rate","Blood pressure panel","Systolic blood pressure", "Systolic blood pressure:", "Diastolic blood pressure","Diastolic blood pressure:","resp rate") 

Sign_Value <- c(10, 12, "80/120", 120, 120, 80, 80, 15) 
Vital_Sign <- as.data.frame(cbind(Sign_desc,Sign_Value)) 

Vital_Sign$Sign_desc[Vital_Sign$Sign_desc=="Respiratory Rate"] <- "RR" 
Vital_Sign$Sign_desc[Vital_Sign$Sign_desc=="Resp Rate:"] <- "RR" 
Vital_Sign$Sign_desc[Vital_Sign$Sign_desc=="resprate"] <- "RR" 
+3

есть не волшебная функция, пожалуйста, ваш например воспроизводимый – rawr

+0

'grep' /' grepl', возможно. Скорее всего, быстрее назначить непосредственно уровни факторов вместо значений, но будьте осторожны с вашим заказом или вы испортите свои данные. – alistaire

+0

@rawr Создал пример воспроизводимого. – user3897

ответ

2

Вы можете использовать levels для прямого доступа уровней факторов, а не изменение самих данных:

levels(Vital_Sign$Sign_desc)[levels(Vital_Sign$Sign_desc)=="Respiratory Rate"] <- "RR" 
levels(Vital_Sign$Sign_desc)[levels(Vital_Sign$Sign_desc)=="Resp Rate"] <- "RR" 
levels(Vital_Sign$Sign_desc)[levels(Vital_Sign$Sign_desc)=="resprate"] <- "RR" 

Чтобы сделать все это сразу:

levels(Vital_Sign$Sign_desc)[levels(Vital_Sign$Sign_desc) %in% c("Respiratory Rate", "Resp Rate","resprate")] <- "RR" 
1

Более автоматизированным еще меньше явным способом, чем @ метод HubertL будет использовать строки расстояний.

Sign_desc <- c("Resp rate:","Respiratory rate","Blood pressure panel", 
       "Systolic blood pressure", "Systolic blood pressure:", 
       "Diastolic blood pressure","Diastolic blood pressure:","resp rate") 

ad <- adist(Sign_desc) 
rownames(ad) <- Sign_desc 

hc <- hclust(as.dist(ad)) 
plot(hc) 
rect.hclust(hc, 3) 

enter image description here

Основываясь на графике выше, 3 группы могут быть уместными, так что вы можете использовать cutree, чтобы увидеть, какие строки будут попадать в какие группы

(ct <- cutree(hc, 3)) 
# Resp rate:   Respiratory rate  Blood pressure panel 
#   1       1       2 
# Systolic blood pressure Systolic blood pressure: Diastolic blood pressure 
#      3       3       3 
# Diastolic blood pressure:     resp rate 
#       3       1 

И вы можете использовать эти группы, чтобы привести ваши новые имена в порядок. Из выше, я хочу RR, чтобы соответствовать 1s, BP с 2s и 3s и т.д.

## new names corresponding to the groups above 
nn <- c('RR', 'BP', 'BP') 

cbind(old = Sign_desc, new = nn[ct]) 
#  old       new 
# [1,] "Resp rate:"    "RR" 
# [2,] "Respiratory rate"   "RR" 
# [3,] "Blood pressure panel"  "BP" 
# [4,] "Systolic blood pressure" "BP" 
# [5,] "Systolic blood pressure:" "BP" 
# [6,] "Diastolic blood pressure" "BP" 
# [7,] "Diastolic blood pressure:" "BP" 
# [8,] "resp rate"     "RR" 

Вот весь код, используемый

Sign_desc <- c("Resp rate:","Respiratory rate","Blood pressure panel","Systolic blood pressure", "Systolic blood pressure:","Diastolic blood pressure","Diastolic blood pressure:","resp rate") 
ad <- adist(Sign_desc) 
rownames(ad) <- Sign_desc 
hc <- hclust(as.dist(ad)) 
plot(hc) 
rect.hclust(hc, 3) 
(ct <- cutree(hc, 3)) 
nn <- c('RR', 'BP', 'BP') 
cbind(old = Sign_desc, new = nn[ct]) 
Смежные вопросы