Столбец dplyr group_by не найден

Работаю над приложением RShiny, и в настоящее время у меня проблемы с функцией dplyrgroup_by(). У меня есть две определенные функции:

  • gather_info: находит категорию с самым высоким/самым низким средним значением
  • paste_info: вызывает gather_info и возвращает соответствующую категорию и значение

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

Вызов gather_info с соответствующими аргументами работает, как и ожидалось. Однако paste_info последовательно возвращает:

Error in `group_by()`:
! Must group by variables found in `.data`.
✖ Column `grp.col` is not found.

Вот воспроизводимый пример, где желаемый результат paste_info таков: «Учитывая ваши данные, ваша группа с лучшими показателями — это группа Cat1 с результатом 90%, а группа с худшими показателями — группа Cat2 с результатом 20%.»:

gather_info <- function(df, grp.col, maxm) {
    df |> 
        mutate_if (
            .predicate = function(x) is.character(x),
            .funs = function(x) str_to_title(x)
        ) |> 
        group_by({{ grp.col }}) |> 
        summarize(percentage = round(mean(value, na.rm=TRUE) * 100, 2)) |> 
        arrange(desc(percentage)) %>%  # c'est un pipe
        {if (maxm) head(., 1) else tail(., 1)}
}

paste_info <- function(df, grp.col) {
    
    high_df <- gather_info(df, grp.col, maxm=TRUE)
    low_df <- gather_info(df, grp.col, maxm=FALSE)

    paste0("Given your data, your best performing group is ",
          high_df |> pull(grp.col), " scoring ", high_df$percentage, "%",
          " and your worst performing group is ",
          low_df |> pull(grp.col), " scoring ", low_df$percentage, "%.")
}


df <- data.frame(
    category=c('cat1', 'cat1', 'cat2', 'cat2', 'cat2', 'cat3', 'cat3'),
    value=c(1,0.8,0.2,0.3,0.1,0.5,0.5)
)

# returns category, value with highest mean value
gather_info(df, category, maxm=TRUE)

# returns category, value with lowest mean value
gather_info(df, category, maxm=FALSE)

# does not work
paste_info(df, category)

Любая помощь очень ценится. Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что внутри paste_info вы должны использовать {{ для передачи столбца группировки grp.col в gather_info, а также при вызове pull. По той же причине вы должны использовать {{ в group_by внутри gather_info

В некотором смысле {{ переводится, например. gather_info(df, {{ grp.col }}, maxm = TRUE) в gather_info(df, category, maxm = TRUE), то есть вы переходите category в gather_info. Без {{ имя столбца, хранящееся в grp.col, не будет «вставлено» в выражение или вызов функции. Следовательно, gather_info примет grp.col как есть и интерпретирует его как имя столбца группировки. Но так как в ваших данных нет столбца с именем grp.col, вы получаете ошибку.

Для получения дополнительной информации о том, зачем нужен {{, см. Что такое маскирование данных и зачем мне {{?.

library(dplyr)

paste_info <- function(df, grp.col) {
  high_df <- gather_info(df, {{ grp.col }}, maxm = TRUE)
  low_df <- gather_info(df, {{ grp.col }}, maxm = FALSE)

  paste0(
    "Given your data, your best performing group is ",
    high_df |> pull({{ grp.col }}), " scoring ", high_df$percentage, "%",
    " and your worst performing group is ",
    low_df |> pull({{ grp.col }}), " scoring ", low_df$percentage, "%."
  )
}

paste_info(df, category)
#> [1] "Given your data, your best performing group is Cat1 scoring 90% and your worst performing group is Cat2 scoring 20%."

Обман, спасибо ^ Я могу понять, почему это так, но не могли бы вы объяснить, почему это исправление?

big_cactus 04.11.2022 02:35

Я отредактировал свой вопрос, добавив объяснение своими словами и ссылку на то, зачем нам нужен {{.

stefan 04.11.2022 07:48

Другие вопросы по теме

Если в df обнаружена строка, создайте новый столбец с заменой строки + R + dplyr
Найдите максимальное значение по отношению к другому в пределах двух кадров данных (ВПР, которое возвращает максимальное значение) в R
Как разделить имена факторов в столбце во фрейме данных в R?
Как объединить несколько дублирующих широкоформатных фреймов данных в один длинный фрейм данных?
`dplyr` способ разбить переменную на несколько столбцов в соответствии с макетом-словарем (с именем переменной и длиной)
Развернуть коды МКБ-10 из одной строки в несколько строк
Как преобразовать широкоформатные данные с несколькими переменными в данные длинного формата за один шаг в R
Ошибка соответствия строки "недопустимое регулярное выражение, причина "Недостаточно памяти""
Какой эффект имеет установка атрибута вектора в dplyr::summarize()?
R вложенный glm с двумя подгруппами