Написание конвейерной функции в синтаксисе dplyr, используя enquo (), не возвращая предполагаемый вывод - PullRequest
0 голосов
/ 31 мая 2018
library(tidyverse)
library(stringr)
library(janitor) 

word_count <- function(data, char_col) {
  char_col <- enquo(char_col)

  data %>% 
    select(!!char_col) %>% 
    mutate(char_col = str_remove_all(!!char_col, '[[:punct:]]')) %>% 
    mutate(char_col = str_split(!!char_col, ' ')) %>% 
    separate(char_col, into = paste0('col', 1:30), fill = 'right') %>% 
    select(-col1) %>% 
    gather(value = word) %>% 
    select(word) %>% 
    remove_empty(c('rows')) %>%
    filter(word != '') %>% 
    mutate(word = str_to_lower(word)) %>% 
    group_by(word) %>% 
    summarize(freq = n()) %>% 
   arrange(desc(freq))
}

iris %>% 
  as.tibble() %>% 
  mutate(Species = str_c(Species, ' species')) %>% 
  word_count(Species)

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

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

Я хочу, чтобы вывод функции соответствовал выводу кода ниже.

iris %>% 
  as.tibble() %>% 
  mutate(Species = str_c(Species, ' species')) %>% 
  select(Species) %>% 
  mutate(Species = str_remove_all(Species, '[[:punct:]]')) %>% 
  mutate(Species = str_split(Species, ' ')) %>% 
  separate(Species, into = paste0('col', 1:30), fill = 'right') %>% 
  select(-col1) %>% 
  gather(value = word) %>% 
  select(word) %>% 
  remove_empty(c('rows')) %>%
  filter(word != '') %>% 
  mutate(word = str_to_lower(word)) %>% 
  group_by(word) %>% 
  summarize(freq = n()) %>% 
  arrange(desc(freq)) 

1 Ответ

0 голосов
/ 31 мая 2018

Мы не можем присвоить объект char_col в качестве имени столбца для mutate.Это должно быть оценено.char_col - это объект quosure, который можно преобразовать в character (quo_name(char_col)) или symbol, который при оценке (!!) назначит (:=) правильное имя столбца

 word_count <- function(data, char_col) {
  char_col <- enquo(char_col)
  char_colC <- quo_name(char_col)

  data %>% 
    select(!!char_col) %>% 
    mutate(!!char_colC := str_remove_all(!!char_col, '[[:punct:]]')) %>% 
    mutate(!!char_colC := str_split(!!char_col, ' ')) %>% 
    separate(char_colC, into = paste0('col', 1:30), fill = 'right') %>%
    select(-col1) %>% 
    gather(value = word) %>% 
    select(word) %>% 
    remove_empty(c('rows')) %>%
    filter(word != '') %>% 
    mutate(word = str_to_lower(word)) %>% 
    group_by(word) %>% 
    summarize(freq = n()) %>% 
    arrange(desc(freq))
}

out2 <- iris %>%
           as.tibble() %>%
           mutate(Species =str_c(Species, ' species')) %>%
           word_count(Species)

- проверка выхода без использования функции

out1 <- iris %>% 
          as.tibble() %>% 
          mutate(Species = str_c(Species, ' species')) %>% 
          select(Species) %>% 
          mutate(Species = str_remove_all(Species, '[[:punct:]]')) %>% 
          mutate(Species = str_split(Species, ' ')) %>% 
          separate(Species, into = paste0('col', 1:30), fill = 'right') %>% 
          select(-col1) %>% 
          gather(value = word) %>% 
          select(word) %>% 
          remove_empty(c('rows')) %>%
          filter(word != '') %>% 
          mutate(word = str_to_lower(word)) %>% 
          group_by(word) %>% 
          summarize(freq = n()) %>% 
          arrange(desc(freq)) 


identical(out1, out2)
#[1] TRUE
...