2016-04-04 16 views
4

Ich möchte wissen, ob es zulässig ist, ein Gleichheitszeichen (=) im recodes Parameter der recode Funktion im Auto-Paket zu verwenden?recode (Auto-Paket) Funktion - Recodes Argument und Gleichheitszeichen

Zum Beispiel schlägt die folgenden:

library(car) 
n <- c(0, 10, 20, 21, 60, 70) 
r <- recode(n, " 0:20 = '<= 20' ; 20:70 = '> 20' ") 
# Error in recode(n, " 0:20 = '<= 20' ; 20:70 = '> 20' ") : 
# in recode term: 0:20 = '<= 20' 
# message: Error in parse(text = strsplit(term, "=")[[1]][2]) : 
# <text>:1:2: unexpected INCOMPLETE_STRING 
# 1: '< 
#^

die = von <= 20 Entfernen funktioniert:

r <- recode(n, " 0:20 = '< 20' ; 20:70 = '> 20' ") 
table(r) 
r 
# <20> 20 
# 3 3 

I recode in einem Kontext bin mit dem ich die recodes Argument nehmen bin Als Benutzereingabe hoffe ich, dass jede Lösung keine expliziten Escape-Zeichen benötigt, da dies lästig wäre.

Ich bin mit R-Version 3.2.3 (2015.12.10) - „Holz-Weihnachtsbaum“

+1

Warum nicht einfach ersetzen später? 'r <- gsub (" ~ "," = ", recode (n," 0:20 = '<~ 20'; 20:70 = '> 20' "))' –

+0

das ist ziemlich ähnlich zu @ Jianfengs Antwort unten ... –

Antwort

1

hatte ich das gleiche Problem und keine Lösung gefunden hat. Hier ist meine ungeschickte Lösung, mit gsub

r <- recode(n, " 0:20 = '< 20' ; 20:70 = '> 20' ") 
r <- gsub("< 20", "<= 20", r) 
2

car::recode immer ein Schmerz sein wird, da sie die recode Zeichenfolge (das bricht, wenn es sich um eine „unechte“ enthält gleich überall Vorzeichen) analysiert.

Für Ihre insbesondere Anwendung cut gut funktioniert:

n <- c(0, 10, 20, 21, 60, 70) 
cut(n,breaks=c(-1,20,Inf),labels=c("<= 20", ">20")) 

plyr::revalue ist nützlich für eine Eins-zu-Eins-Abbildung (auch plyr::mapvalues sehen):

x <- factor(c("a","b","c")) 
revalue(x,c("a"=">= 20")) 

Ich weiß nicht, von eine gute Lösung von der Stange:

x <- factor(letters[1:8]) 
oldvals <- list(c("a","b","c"),c("d","e"),c("f","g","h")) 
newvals <- c("new1","new2","new3") 
for (i in seq_along(oldvals)) { 
    m <- which(levels(x) %in% oldvals[[i]]) 
    if (length(m)>0) 
     levels(x)[m] <- rep(newvals[i],length(m)) 
} 

Dies könnte ein bisschen hässlich, wenn die neuen/alten Codes überschneiden sich in einigen pathologischen Quere ...

2

I recode in einem Kontext bin mit dem ich die recodes Argument als Input des Benutzers bin

ich bin nicht sicher, was das bedeutet, aber das ist ziemlich Ende benutzerfreundlich:

map_em = function(
    n, 
    recs = readline(prompt = "enter map like key = value, key2 = value2: \n") 
){ 
    m = eval(parse(text = sprintf("list(%s)", recs))) 
    s = stack(m) 
    s$ind[ match(n, s$value) ] 
} 

# usage example 
map_em(n) 
# enter map like key = value, key2 = value2: 
'<= 20' = 0:20, '> 20' = 21:70 
# [1] <= 20 <= 20 <= 20 > 20 > 20 > 20 
# Levels: <= 20 > 20 

Weil es match verwendet, können Ihre Benutzer eingeben overlappin g Werte (wie das OP tat, schreiben 0:20 und 20:70) und es wird einfach das erste Spiel nehmen.


In ähnlicher Weise könnte der Benutzer die Zuordnung direkt in den Funktionsaufruf übergeben:

map_em2 = function(n, ...){ 
    m = list(...) 
    s = stack(m) 
    s$ind[ match(n, s$value) ] 
} 

# usage example  
map_em2(n, '<= 20' = 0:20, '> 20' = 21:70) 
# [1] <= 20 <= 20 <= 20 > 20 > 20 > 20 
# Levels: <= 20 > 20