动态更改使用summarise()和complete()创建的列名

问题描述 投票:1回答:1

我正在尝试动态创建一个额外的列。第一段代码按我的意愿工作:

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
r dplyr tidyr
1个回答
0
投票

您可以将fillcomplete()参数保留为默认值(它将为您提供缺少的值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))  
}
© www.soinside.com 2019 - 2024. All rights reserved.