2017-09-08 1 views
0

Ich hoffe, diese Frage ist für dieses Forum nicht allzu leicht (eigentlich bin ich mir fast ein bisschen peinlich, diese Frage hier zu stellen, aber ich kämpfe mit diesem kleinen Problem das Ganze Tag ...)Funktion für Labelvariable vor dem Plotten in R

I Datenrahmen haben wie folgt aussehen:

df <- data.frame(runif(4), 
      c("po", "pr", "po", "pr"), 
      c("Control 1","Control 1", "Treatment 1", "Treatment 1")) 

names(df) <- list("values", "test_type", "group") 

Jetzt möchte ich easliy die Variablen „test_type“ und „Gruppe“ für die Handlung danach wieder beschriften. (Es ist schöner „Pretest“ anstelle von „pr“ in einer Präsentation :-) zu lesen) ich könnte es tun manuell mit:

df$test_type <- factor(df$test_type, 
        levels = c("pr", "po"), 
        labels = c("pretest", "posttest")) 
df$group <- factor(df$group, 
       levels = c("Control 1", "Treatment 1"), 
       labels = c("control", "EST")) 

In diesem Fall würde ich dies mehr Datenrahmen für eine Menge wiederholen , die mich dazu bringen, eine Funktion zu schreiben:

var_label <- function(df, test, groups){ 

# Create labels 
df$test_type <- factor(df$test, 
        levels = c("pr", "po"), 
        labels = c("pretest", "posttest")) 
df$group <- factor(df$groups, 
       levels = c("Control 1", "Treatment 1"), 
       labels = c("control", "EST")) 

return(list(df$test_type, df$group)) 
} 

Leider funktioniert das nicht. Ich habe eine Menge leicht unterschiedliche Versionen und auch andere Befehle aus dem Hmisc-Paket ausprobiert, aber keines davon hat funktioniert. Ich weiß, ich kann dieses Problem auf andere Weise lösen, aber ich versuche, effizientere und kürzere Codes zu schreiben, und wäre wirklich interessiert, was ich ändern muss, damit diese Funktion funktioniert. Oder noch besser: Haben Sie einen Vorschlag für einen effizienteren Weg?

Vielen Dank im Voraus!

+2

Sie müssen 'help (" $ ")' 'lesen. – Roland

+1

Haben Sie '? Forcats :: fct_relabel' angeschaut? – joemienko

Antwort

0

Wie ich oben erwähnt habe, denke ich forcats::fct_relabel() ist, was Sie hier wollen, zusammen mit dplyr::mutate_at(). Unter der Annahme, dass Ihre Umbenennungsbedürfnisse nicht komplexer sind als die in Ihrer Frage beschriebenen, sollten Sie im Folgenden das erhalten, wonach Sie suchen.

####BEGIN YOUR DATAFRAME CREATION#### 
df <- data.frame(runif(4), 
       c("po", "pr", "po", "pr"), 
       c("Control 1","Control 1", "Treatment 1", "Treatment 1")) 

names(df) <- list("values", "test_type", "group") 
#####END YOUR DATAFRAME CREATION##### 

# Load dplyr and forcats 
library(dplyr) 
library(forcats) 

# create a map of labels and levels based on your implied logic 
# the setup is label = level 
label_map <- c("pretest" = "pr" 
       ,"posttest" = "po" 
       ,"control" = "Control 1" 
       ,"EST" = "Treatment 1") 

# create a function to exploit the label map 
fct_label_select <- function(x, map) { 
    names(which(map == x)) 
} 

# create a function which is responsive to a character vector 
# as required by fct_relabel 
fct_relabeler <- function(x, map) { 
    unlist(lapply(x, fct_label_select, map = map)) 
} 

fct_relabeler(levels(df$test_type), map = label_map) 

# function to meet your apparent needs 
var_label <- function(df, cols, map){ 
    df %>% 
    mutate_at(.vars = cols 
       ,.funs = fct_relabel 
       ,fun = fct_relabeler 
       ,map = map) 
} 

var_label(df = df, cols = c("test_type", "group"), map = label_map) 

# values test_type group 
# 1 0.05159681 posttest control 
# 2 0.89050323 pretest control 
# 3 0.42988881 posttest  EST 
# 4 0.32012811 pretest  EST 
+0

Vielen Dank für Ihre Hilfe! Das habe ich gesucht! Ich habe das forcat-Paket noch nicht gekannt, aber das funktioniert gut. – user6925545