使用dplyr和group_by编写自己的函数-如何继续更改的列名

前夕

我想发布一些表,以给出观察结果的数量,并按两个变量分组。此代码工作正常。但是,在尝试将其转换为函数时遇到了问题。

我正在使用dplyr_0.7.2

使用mtcars的示例:

功能外的表格代码:这有效

library(tidyverse) 

tab1 <- mtcars %>% count(cyl) %>% rename(Total = n) 

tab2 <- mtcars %>%
  group_by(cyl, gear) %>% count %>% 
  spread(gear, n)

tab <- full_join(tab1, tab2, by = "cyl")
tab


# This is the output (which is what I want)

A tibble: 3 x 5
cyl Total   `3`   `4`   `5`
<dbl> <int> <int> <int> <int>
1     4    11     1     8     2
2     6     7     2     4     1
3     8    14    12    NA     2

试图把它变成一个函数

tab1的功能:可行

count_by_two_groups_A <- function(df, var1){
  var1 <- enquo(var1)
  tab1 <- df %>% count(!!var1) %>% rename(Total = n)
  tab1
} 

count_by_two_groups_A(mtcars, cyl) 

A tibble: 3 x 2
cyl Total
<dbl> <int>
1     4    11
2     6     7
3     8    14

tab2的第一部分的功能:到现在为止都有效,但是...

count_by_two_groups_B <- function(df, var1, var2){

  var1 <- enquo(var1)
  var2 <- enquo(var2)

  tab2 <- df %>% group_by((!!var1), (!!var2)) %>% count
  tab2
} 

count_by_two_groups_B(mtcars, cyl, gear)

A tibble: 8 x 3
Groups:   (cyl), (gear) [8]
 `(cyl)` `(gear)`     n
 <dbl>    <dbl> <int>
 1       4        3     1
 2       4        4     8
 3       4        5     2
 4       6        3     2
 5       6        4     4
 6       6        5     1
 7       8        3    12
 8       8        5     2

列名称已更改为(cyl)和(gear)。既然列名已更改,我似乎无法弄清楚如何继续使用spread()和full_join()(或使用新列名的其他任何内容)。即我无法弄清楚如何以tidyeval方式指定新的列名,以便继续进行。我尝试了各种事情,但没有成功。

莱昂内尔·亨利

在tidyeval上下文中设置名称的通常方法是使用定义运算符:=它看起来像这样:

df %>%
  group_by(
    !! nm1 := !! var1,
    !! nm2 := !! var2
  ) %>%
  count()

为此,你需要提取nm1var1不幸的是,我还没有一种简单的方法来去除括号。我认为在即将到来的功能中执行此操作是有意义的ensym()(如果您提供呼叫,它会捕获符号而不是保证金并发出错误)。我已经在这里提交了票证:https : //github.com/tidyverse/rlang/issues/223

幸运的是,这里有两个简单的解决方案。首先请注意,您不需要使用括号。仅当其他运算符涉及捕获的表达式时才需要它们。例如在这些情况下:

(!! var) / avg
(!! var) < value

在这种情况下,如果省略括号,!!将尝试取消整个表达式的引用,而不仅仅是一个符号。另一方面,您的函数中没有运算符,因此您可以安全地取消引用而无需将其括起来:

count_by_two_groups_B <- function(df, var1, var2) {
  var1 <- enquo(var1)
  var2 <- enquo(var2)

  df %>%
    group_by(!! var1, !! var2) %>%
    count()
}

最后,可以通过允许可变数量的参数来使函数更通用。由于点被转发,因此这甚至更容易实现,因此无需捕获和取消引用。只需将它们传递给group_by()

count_by <- function(df, ...) {
  df %>%
    group_by(...) %>%
    count()
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在函数中使用dplyr :: group_by

如何在dplyr中使用group_by()和do()为每个因子水平应用一个函数

如何使用 dplyr 的 coalesce 函数和 group_by() 来为每人创建一行并填写所有值?

将列名传递到R dplyr group_by和summary函数

如何使用dcast更改列名?

如何将多个group_by参数和动态变量参数传递给dplyr函数

如何使用向量化以及dplyr中的group_by函数迭代列

dplyr group_by列名的向量?

如何在使用Dplyr的Group_by和Summarise_at时对n()使用na.rm = TRUE

如何使分位数与summarise_at和group_by(dplyr)一起使用

如何使用 R 和 dplyr 中连续的元素执行 group_by

如何使用列名更改表的值

使用Dplyr :: Group_by和Dplyr :: Summarise时如何从不同的分组变量中输出汇总列表

dplyr group_by和mutate,如何访问数据帧?

在 group_by 子句中使用列名创建函数

如何使用 for 和 if 编写函数

如何在 dplyr 的 group_by 上使用 if/ifelse

如何使用 dplyr 到 group_by() 来折叠子系列

使用dplyr :: mutate()中的默认列名输入编写函数

如何编写一个使用 broom、dplyr 和 lm 的函数?

使用循环更改函数和列名

如何仅使用time.After编写自己的Sleep函数?

如何更改Mat表中的列名和值

如何用dplyr和点椭圆编写嵌套函数?

如何使用名称列表更改pandas Dataframe中的列名称?

使用案例时如何更改列名?SQL Server查询

如何使用Pyarrow更改镶木地板文件中的列名?

R如何使用列表名更改dafaframe列名

如何使用pyarrow.read_csv添加/更改列名称?