2016-03-29 12 views
0

Ich habe einen Datenrahmen mit einer Faktorvariablen, die ein Vitalzeichen darstellt. Es hat 50 Stufen. Aber, viele Ebenen sind repetitive.For zB: "Respiratory Rate" kann als "Resp Rate" oder "RR" usw. codiert werden. Ich möchte alle Atemfrequenzen in einer einzigen Ebene gruppieren und das gleiche für andere Vitalfunktionen tun. Ich habe die folgende Methode ausprobiert. Gibt es einen besseren Weg, dies zu tun?Bin Zeichenvariablen in 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

dort verwendet wird, ist keine magische Funktion, stellen Sie Ihre Beispiel reproduzierbar – rawr

+0

'grep' /' grepl', wahrscheinlich. Es ist wahrscheinlich schneller, den Faktorstufen statt der Werte auch direkt zuzuordnen, aber seien Sie vorsichtig mit Ihrer Bestellung oder Sie werden Ihre Daten durcheinander bringen. – alistaire

+0

@rawr machte das Beispiel reproduzierbar. – user3897

Antwort

2

können Sie levels verwenden, um direkt auf die Ebenen Faktoren eher zugreifen als das Ändern von Daten selbst:

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" 

Um alles auf einmal zu tun:

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

Eine automatisierte noch weniger Der explizite Weg als @ HubertLs Methode wäre die Verwendung von String-Distanzen.

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

oben auf dem Grundstück Basierend 3 Gruppen könnte angemessen sein, so dass man dann cutree verwenden können, um festzustellen, welche Zeichenketten, in die Gruppen

(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 

fallen Und Sie können verwenden Diese Gruppen geben Ihre neuen Namen in Reihenfolge an. Von oben, ich will RR den 1s entsprechen, BP zu den 2s und 3s usw.

## 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" 

Hier der gesamte Code

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]) 
Verwandte Themen