dplyr: переменная group_by & mutate не может вызывать функции mean / sd - PullRequest
0 голосов
/ 12 сентября 2018

Извините, если название немного запутанное, так как я не знал, как еще объяснить эту проблему. По сути, я пытаюсь изменить процент от переменной группы , используя dplyr. Однако я сталкиваюсь с проблемой, когда новая вычисляемая переменная выглядит числовой и даже вычисляет при использовании summary(), но не позволяет мне вызывать mean() или sd(), не выдавая мне следующую ошибку:

Warning message:
In mean.default(., group_pct) :
  argument is not numeric or logical: returning NA 

Вот несколько примеров того, что происходит.

data(mtcars)

mtcars %>% 
  group_by(cyl) %>% 
  mutate(group_pct = hp / sum(hp)) %>% 
  summary()

enter image description here

Примечание: group_pct вычисляется правильно при вызове через summary() ...

data(mtcars)

mtcars %>% 
  group_by(cyl) %>% 
  mutate(group_pct = hp / sum(hp)) %>% 
  mean(group_pct)

enter image description here

... но когда я вызываю здесь среднее, оно не может завершить функцию. Даже когда я использую ungroup() и / или na.rm = TRUE, функция все равно не работает. Я не понимаю, в чем проблема здесь.


РЕДАКТИРОВАТЬ: Для уточнения, я надеюсь сделать что-то вроде этого ...

mtcars %>% 
  group_by(cyl) %>% 
  mutate(group_pct = hp / sum(hp)) %>% 
  paste0('Words: ', mean(group_pct))

Надеясь на этот конечный результат:

Words: 0.09375

... который я не могу использовать summarize(), поэтому я не включил его с самого начала. Приносим извинения за возможные неудобства.

Ответы [ 4 ]

0 голосов
/ 12 сентября 2018

Проблема в том, как вы подключаетесь к функции mean.Посмотрите на ваше сообщение об ошибке:

Warning message:
In mean.default(., group_pct)

Вы пытаетесь получить среднее значение столбца group_pct фрейма данных, переданных по конвейеру, но вместо этого mean получает оба данных по конвейеру.frame (. представляет выходные данные канала) и объект group_pct, который может существовать или не существовать.

Посмотрите на этот ответ: https://stackoverflow.com/a/38475455/8366499

Есливы хотите поместить piped data.frame в среднюю функцию, вам нужно использовать фигурные скобки {}, чтобы обращение к Mean обрабатывалось как выражение, а не как вызов функции.Затем вы можете поднастроить объект . по своему желанию:

mtcars %>% 
    group_by(cyl) %>% 
    mutate(group_pct = hp / sum(hp)) %>% 
    {mean(.$group_pct)} %>%
    paste0('Words: ', .)

[1] "Words: 0.09375"
0 голосов
/ 12 сентября 2018

За разъяснение ОП:

mtcars %>% 
  group_by(cyl) %>% 
  mutate(group_pct = hp / sum(hp)) %>%
  pull(group_pct) %>%
  mean() %>%
  paste0("Words: ", .)

[1] "Words: 0.09375"
0 голосов
/ 12 сентября 2018

Вы хотите функцию baseR with().

mtcars %>% 
  group_by(cyl) %>% 
  mutate(group_pct = hp / sum(hp)) %>%
  with(paste0('Words: ', mean(group_pct)))

[1] "Words: 0.09375"

Проблема с вашей первоначальной попыткой заключается в том, что group_pct не определено в глобальной среде, поэтому вы получаете сообщение об ошибке, когда оно не может найти его в поиске.

with - это синтаксический сахар, который указывает R оценивать вызов функции paste0() в среде фрейма данных, передаваемого по каналу. Таким образом, он находит group_pct и возвращает ожидаемый результат.

0 голосов
/ 12 сентября 2018
library(tidyverse)
library(purrr)

mtcars %>% 
  mutate(group_pct = hp / sum(hp)) %>% 
  summarise_all(mean) %>%
  select(group_pct) %>%
  map(function(x) paste0(" Word ", x))

и результат:

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