Динамически изменить имя столбца, созданного с помощью Sumumze () и Complete () - PullRequest
1 голос
/ 17 октября 2019

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

library(dplyr)
library(tidyr)

set.seed(1)

df <- data.frame(animals = sample(c('dog', 'cat', 'rat'), 100, replace = T))

my_fun <- function(data, column_name){

  data %>% group_by(animals) %>%
         summarise(!!column_name := n())

}

my_fun(df, 'frequency')

Здесь я также использую полную функцию, и она не работает:

library(dplyr)

set.seed(1)

df <- data.frame(animals = sample(c('dog', 'cat', 'rat'), 100, replace = T))

my_fun <- function(data, column_name){

  data %>% group_by(animals) %>%
         summarise(!!column_name := n())%>%
         ungroup() %>%
         complete(animals = c('dog', 'cat', 'rat', 'bat'),
                  fill = list(!!column_name := 0))

}

my_fun(df, 'frequency')

Функция списка не работаеткажется, что !!column_name :=

Есть ли что-то, что я могу сделать, чтобы сделать эту работу? В основном я хочу, чтобы второй кусок кода вывел:

animals frequency
bat      0
cat      38
dog      27
rat      35

1 Ответ

1 голос
/ 17 октября 2019

Вы можете оставить аргумент fill, равный complete(), по умолчанию (что даст вам пропущенные значения как NA) и впоследствии заменить их на 0:

my_fun <- function(data, column_name){
  data %>%
    group_by(animals) %>%
    summarise(!!column_name := n())%>%
    ungroup() %>%
    complete(animals = c('dog', 'cat', 'rat', 'bat')) %>%
    mutate_all(~replace(., is.na(.), 0))  
}
...