сохранить исходное имя переменной при группировке итогов с помощью summaze () в функции R - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь написать функцию в R для подведения итогов таблицы.Ниже приведен пример функции, и я использую данные Iris в качестве теста.

test_func <- function(data, by_var_nm) {
  by_var_nm <- deparse(substitute(by_var_nm))

  tbl_test_sum <- data %>% 
    group_by(data[[by_var_nm]]) %>% 
    summarise(
      count = n()
    )
  tbl_test_sum
}

test_func(iris, Species)

Как вы могли видеть, в выходных данных в следующем разделе есть проблема, при которой первая переменная в таблиценазывается «данные [[by_var_nm]]» вместо «видов».Можно ли как-нибудь сохранить исходное имя переменной во время процесса суммирования?

# A tibble: 3 x 2
  `data[[by_var_nm]]` count
  <fct>               <int>
1 setosa                 50
2 versicolor             50
3 virginica              50

Спасибо.

Спасибо всем за очень полезный ответ.Я попробовал решения, и, похоже, ответ Снорама решил мою начальную проблему довольно хорошо.Однако после того, как я объединил все воедино, я не мог заставить последний фрагмент сюжета работать должным образом.Идея состоит в том, что я хочу нанести процентное распределение на «var_nm» и сгруппировать их по «by_var_nm».Проблема, которую я получил, состоит в том, что гистограмма, а также процентная доля для метки данных выстроены неправильно.

test_func <- function(data, var_nm, by_var_nm) {
  var_nm <- deparse(substitute(var_nm))
  by_var_nm <- deparse(substitute(by_var_nm))

  tbl_test_sum <- as.data.frame(table(data[[by_var_nm]], data[[var_nm]]))
  names(tbl_test_sum) <- c(by_var_nm, var_nm, "count")

  # tbl_test_sum

  tbl_test_total <- as.data.frame(table(data[[by_var_nm]]))
  names(tbl_test_total) <- c(by_var_nm, "total")

  # tbl_test_total

  tbl_test_pctg <- full_join(tbl_test_sum, tbl_test_total, by = by_var_nm) %>%
    mutate(
      percentage = count / total
    )

  # tbl_test_pctg

  ggplot(data=tbl_test_pctg, aes(x = tbl_test_pctg[[var_nm]], y = percentage, fill = tbl_test_pctg[[var_nm]])) +
    geom_bar(stat="identity") +
    geom_text(aes(label = scales::percent(percentage))) +
    facet_grid(tbl_test_pctg[[by_var_nm]]~.) +
    coord_flip()
}

test_func(mtcars, cyl, am)

enter image description here

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Предлагает решение, подобное Александру, но одновременно нарушает зависимость dplyr.Если вы планируете сохранить эту функцию, я думаю, что ненужные зависимости не очень хорошая идея.

test_func <- function(data, by_var_nm) {
  by_var_nm <- deparse(substitute(by_var_nm))
  tbl_test_sum <- as.data.frame(table(data[[by_var_nm]]))
  names(tbl_test_sum) <- c(by_var_nm, "count")
  tbl_test_sum
}

Скорость:

> microbenchmark::microbenchmark(test_func_Alex(iris, Species), test_func_snoram(iris, Species), unit = "relative")
Unit: relative
                            expr      min       lq     mean   median       uq      max neval cld
   test_func_Alex(iris, Species) 6.910679 6.834064 5.827796 5.622154 5.480321 4.009469   100   b
 test_func_snoram(iris, Species) 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000   100  a
0 голосов
/ 05 июня 2018

Вы можете использовать синтаксис цитаты rlang, разработанный для этого варианта использования;Также прочитайте примеры здесь :

library(rlang); library(dplyr)

test_func <- function(data, by_var_nm) {
    by_var_nm <- enquo(by_var_nm)

    tbl_test_sum <- data %>% 
        group_by(!!by_var_nm) %>% 
        summarise(
            count = n()
        )
    tbl_test_sum
}

test_func(iris, Species)

# A tibble: 3 x 2
#  Species    count
#  <fct>      <int>
#1 setosa        50
#2 versicolor    50
#3 virginica     50
0 голосов
/ 05 июня 2018

Я не знаю, почему это происходит, но вы можете использовать этот трюк, чтобы вернуть имя:

test_func <- function(data, by_var_nm) {
  by_var_nm <- deparse(substitute(by_var_nm))

  tbl_test_sum <- data %>% 
    group_by(data[[by_var_nm]]) %>% 
    summarise(
      count = n()
    )
  names(tbl_test_sum)[grep("by_var_nm",names(tbl_test_sum))] <- by_var_nm
  tbl_test_sum
}

test_func(iris, Species)

Вы также можете использовать индекс names(tbl_test_sum)[1], предполагая, что group_by() создаетпервый столбец этой переменной.

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...