【问题标题】:Custom function in R with dplyrR中的自定义函数与dplyr
【发布时间】:2021-08-12 19:12:20
【问题描述】:

我正在尝试为 R 编写一个自定义函数,其中包含 dplyr 的元素。

第一部分进展顺利。我做了一个函数,value_count,它为指定数据框中的任何列创建频率分布表:

value_count = function(data, group_col) {
data %>% 
group_by_(.dots = lazyeval::lazy(group_col)) %>% 
summarize(count=n())

这是一个输出示例:

colour  count
green    10
red      8
blue     2

现在,在同一个函数中,我想添加一个“百分比”列来计算选择每种颜色的人的百分比。像这样:

colour  count   percent
green    10       50
red      8        40
blue     2        10

为此,我尝试了这个功能:

value_count2 = function(data, group_col) {
data %>% 
group_by_(.dots = lazyeval::lazy(group_col)) %>% 
summarize(count=n()) %>% 
mutate(percent = count/(sum(count)) * 100)
}

但我收到此错误:

"Error: Problem adding computed columns in `group_by()`.
x Problem with `mutate()` input `..1`.

我已经在创建函数之外对此进行了测试(即在同一数据集上手动执行group_by(group_col) %>% summarize(count=n()) %>% mutate(percent = count/(sum(count)) * 100))并且一切正常:-S

知道发生了什么吗?谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    由于_ 的函数(如group_by_count_ 等)已被弃用,您可以使用 -

    library(dplyr)
    
    value_count <- function(data, group_col) {
      data %>%
        count({{group_col}}, name = 'count') %>%
        mutate(count = prop.table(count) * 100)
    }
    
    value_count(data, colour)
    

    【讨论】:

    • 酷。我不知道 - 谢谢。而且这似乎也很完美!
    • @Ronak Shah。为什么您认为我的答案中使用 mtcars 进行的测试在没有双花括号的情况下有效?谢谢!
    • 我认为这是因为 lazyeval::lazy 的作用类似于 curly curly。
    【解决方案2】:

    有一个错字mutate_应该是mutate

    value_count2 = function(data, group_col) {
        data %>% 
            group_by_(.dots = lazyeval::lazy(group_col)) %>% 
            summarize(count=n()) %>% 
            mutate(percent = count/(sum(count)) * 100)
    }
    

    mtcars测试:

    value_count2 = function(data, group_col) {
        data %>% 
            group_by_(.dots = lazyeval::lazy(group_col)) %>% 
            summarize(count=n()) %>% 
            mutate(percent = count/(sum(count)) * 100)
    }
    
    value_count2(mtcars, cyl)
    

    输出:

        cyl count percent
      <dbl> <int>   <dbl>
    1     4    11    34.4
    2     6     7    21.9
    3     8    14    43.8
    

    【讨论】:

    • 谢谢。不幸的是,这只是我写的问题中的一个错字。在我的原始代码中,“mutate”也没有下划线(我现在已经在问题中修复了它)。我仍然得到错误,这让我认为这是关于我的原始数据集的东西。将进一步看看...
    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2018-09-20
    • 2020-04-04
    相关资源
    最近更新 更多