Попытка реализовать use_labels из пакета expss на ggplot

У меня есть фрейм данных, в котором я использовал библиотеку expss для применения меток к переменным. Пример данных:

library(expss)
data = apply_labels(data,
state= "State",
Q1_Gender_1 = "Male",
Q1_Gender_2 = "Female")

структура данных в конечном итоге выглядит так

dput(data)
structure(list(state = structure("Iowa", label = "State", class = c("labelled", 
"character")), Q1_Gender_1 = structure(0.11, label = "Male", class = c("labelled", 
"numeric")), Q1_Gender_2 = structure(0.89, label = "Female", class = c("labelled", 
"numeric"))), class = "data.frame", row.names = c(NA, -1L))

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

p<- data %>% 
  select(-state)%>% 
  pivot_longer(everything(), names_to="variable", values_to="value") %>%
  ggplot(aes(x = reorder(variable, value), y = value, fill = variable, text = paste0(value*100, "%"))) +
      geom_bar(stat = "identity",position = "dodge")+
      theme(axis.title.x=element_blank(),
            axis.text.x=element_blank(),
            axis.ticks.x=element_blank(),
            axis.title.y=element_blank())+
      coord_flip()+
      theme(legend.position = "none")

винье из expss говорит, что я m предполагается применять use_labels следующим образом:

use_labels(mtcars, {
    # '..data' is shortcut for all 'mtcars' data.frame inside expression 
    ggplot(..data) +
        geom_point(aes(y = mpg, x = wt, color = qsec)) +
        facet_grid(factor(am) ~ factor(vs))
}) 

Я пробовал всеми возможными способами применить use_labels. Насколько я понимаю, синтаксис в основном use_labels(data, {exp}), но документация пакета также показывает использование как use_labels(data, expr), а также то, что его можно использовать в других функциях expss, таких как calculate(data, expr, use_labels = FALSE)

Мне нужна помощь, чтобы понять, как применить use_labels или есть ли лучшее решение для применения меток к набору данных для использования на таком графике?


person Clark    schedule 23.03.2021    source источник


Ответы (1)


Вам нужно поместить свой data.frame в качестве первого аргумента в use_labels и использовать ..data в качестве заполнителя в выражении:

library(dplyr)
library(tidyr)
library(ggplot2)
library(expss)
data = structure(list(state = structure("Iowa", label = "State", class = c("labelled", 
                                                                           "character")), Q1_Gender_1 = structure(0.11, label = "Male", class = c("labelled", 
                                                                                                                                                  "numeric")), Q1_Gender_2 = structure(0.89, label = "Female", class = c("labelled", 
                                                                                                                                                                                                                         "numeric"))), class = "data.frame", row.names = c(NA, -1L))
use_labels(data, {
    ..data %>% 
        select(-state)%>% 
        drop_all_labels() %>% 
        pivot_longer(everything(), names_to="variable", values_to="value") %>%
        ggplot(aes(x = reorder(variable, value), y = value, fill = variable, text = paste0(value*100, "%"))) +
        geom_bar(stat = "identity",position = "dodge")+
        theme(axis.title.x=element_blank(),
              axis.text.x=element_blank(),
              axis.ticks.x=element_blank(),
              axis.title.y=element_blank())+
        coord_flip()+
        theme(legend.position = "none")
})

Кроме того, нам нужно удалить метки с unlab, потому что pivot_longer слишком умен, и игнорировать метод объединения класса labelled.

use_labels просто замените все имена в data.frame и в выражении их метками переменных.

person Gregory Demin    schedule 23.03.2021
comment
Большое спасибо! Я пытался настроить график с помощью use_labels так, как вы показываете, но не понимал, что мне нужно использовать drop_all_labels. Теперь работает отлично! - person Clark; 23.03.2021