- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
% head-6ren">
如何使用户定义的函数与管道和 group_by 一起很好地工作?这是一个简单的函数:
library(tidyverse)
fun_head <- function(df, column) {
column <- enquo(column)
df %>% select(!!column) %>% head(1)
}
该函数与管道配合得很好,并允许按另一列进行过滤:
mtcars %>% filter(cyl == 4) %>% fun_head(mpg)
> mpg
1 22.8
但是,相同的管道工作因 group_by 而失败
mtcars %>% group_by(cyl) %>% fun_head(mpg)
Adding missing grouping variables: `cyl`
# A tibble: 1 x 2
# Groups: cyl [1]
cyl mpg
<dbl> <dbl>
1 6 21
在 group_by 之后使用“do”使其工作:
> mtcars %>% group_by(cyl) %>% do(fun_head(., mpg))
# A tibble: 3 x 2
# Groups: cyl [3]
cyl mpg
<dbl> <dbl>
1 4 22.8
2 6 21
3 8 18.7
应该如何更改该功能,使其与 filter 和 group_by 统一工作而无需“do”?
或者 quosures 与问题无关,而 group_by 只需要使用“do”,因为示例中的函数有多个参数?
最佳答案
这与 quosures 无关。在 fun_head()
中没有非标准评估的情况下,这是同样的问题:
fun_head <- function(df) {df %>% select(mpg) %>% head(1)}
mtcars %>% group_by( cyl ) %>% fun_head()
# Adding missing grouping variables: `cyl`
# # A tibble: 1 x 2
# # Groups: cyl [1]
# cyl mpg
# <dbl> <dbl>
# 1 6 21
如其他问题中所述here和 here , do
是允许您将任意函数应用于每个组的连接器。 dplyr
动词如 mutate
和 filter
不需要 do
的原因是因为它们在内部处理分组数据帧作为特殊情况(参见,例如,the implementation of mutate)。如果您希望自己的函数模拟此行为,则需要区分分组数据框和未分组数据框:
fun_head2 <- function( df )
{
if( !is.null(groups(df)) )
df %>% do( fun_head2(.) )
else
df %>% select(mpg) %>% head(1)
}
mtcars %>% group_by(cyl) %>% fun_head2()
# # A tibble: 3 x 2
# # Groups: cyl [3]
# cyl mpg
# <dbl> <dbl>
# 1 4 22.8
# 2 6 21
# 3 8 18.7
编辑:我想指出 group_by
+ do
的另一种替代方法是使用 tidyr::nest
+ purrr::map
代替。回到带有两个参数的原始函数定义:
fhead <- function(.df, .var) { .df %>% select(!!ensym(.var)) %>% head(1) }
以下两个链是等价的(直到行的排序,因为 group_by
按分组变量排序而 nest
不):
# Option 1: group_by + do
mtcars %>% group_by(cyl) %>% do( fhead(., mpg) ) %>% ungroup
# Option 2: nest + map
mtcars %>% nest(-cyl) %>% mutate_at( "data", map, fhead, "mpg" ) %>% unnest
关于R:为什么 group_by 即使在使用 quosures 时仍然需要 "do",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52911519/
有没有办法从字符串中解析和评估 quosure。我想获得与以下示例相同的输出: library(rlang) a ## ~10 + 2 * b 但从 t ~10 + 2 * b 关于r - 从字符
我正在尝试使用 quosures 在自定义函数中传递变量名称以进行数据处理和在公式中使用,但是我在公式中使用 quosures 是不正确的。有没有更好的方法在公式中取消引用参数? library(dp
当我做: > quo(DLX6-AS1) 输出是: expr: ^DLX6 - AS1 env: global 在破折号周围插入空格。 当我尝试将其转换为字符串时,我得到: quo(DLX6-AS
假设我有一个函数,该函数使用非标准评估 (NSE) 接收数据帧和来自该数据帧的不同数量的变量。有没有比选择()这些变量并计算列数更快/更直接的方法来计算提供的变量的数量? # Works but se
问题 我将如何使用 quosures 执行以下操作? library(tidyverse) lkp % select(one_of(lkpOK)) } stringSelect(mtcars) str
我正在尝试编写一个自定义函数,该函数将使用 quosures 作为 left_join() 函数的“by = c()”部分中的参数来连接两个数据集。 这是我目前对该函数的尝试,它在“by = c(!!
如何使用户定义的函数与管道和 group_by 一起很好地工作?这是一个简单的函数: library(tidyverse) fun_head % select(!!column) %>% head
是否可以使用 purrr 返回 quosures 列表? foo [[1]] #> #> expr: ^1L + 2 #> env: 0000000015213C98 #> #> [[2
在 dplyr v0.7.0 ,引入了.data代词,它允许我们用字符串引用变量。我只是好奇这种方法是否比“quosure”方法更受欢迎。例如,以下是使用 .data 代词的方法: varname %
by dplyr::left_join 中的参数(和 friend )需要一个字符串列表。我的代码已经将感兴趣的变量定义为定语列表,因此我希望通过将定语列表转换为字符串列表来避免再次写下该列表。 我去
我想将一堆列传递给 pmap()里面 mutate() .稍后,我想选择那些相同的列。 目前,我将列名列表传递给 pmap()作为一个quosure,效果很好,虽然我不知道这是否是“正确”的方法。但我
我试图将 data.frame 中的一组变量/值传递给 map函数,但不知道如何处理 .x指的是一个需要评估的quosure:mutate(df2 = map2(variable, value, ~f
我正在尝试编写一个函数,该函数使用对象的名称(如未评估的符号)进行下游应用程序。下面是一个体现这种意义的例子: return_obj_name % return_obj_name()) [[1]] [
我正在尝试编写一个函数,该函数使用对象的名称(如未评估的符号)进行下游应用程序。下面是一个体现这种意义的例子: return_obj_name % return_obj_name()) [[1]] [
这是来自 how to combine ggplot and dplyr into a function? 的跟进. 问题是,如何编写一个使用 dplyr 的函数。 , ggplot并可能指定来自 q
我有一个参与者内部设计的结果,其中包含每个试验的时间序列信息。我想重新调整一些排列测试的条件。我需要编写一个函数,这就是我遇到问题的地方。 我的数据看起来像这样: library(tidyverse)
在 rlang 中有一个非常微妙(并且非常令人困惑)的区别...... quosures 不是 quosure 对象!换句话说: quo()和 enquo()退订 quos()和 enquos()退订
我正在构建一个函数,我将根据字符串操作数据框。在该函数中,我将根据字符串构建一个列名称,并使用它来操作数据框,如下所示: library(dplyr) orig_df % filter(!!
我将使用以下示例来解释我的问题。但问题不仅与这个具体示例有关,而且更普遍地与 R 中的元编程有关。 我有两个特定的函数来作图 具体功能1 draw_hists <- function(dts, ind
代码: GeoSeparate % separate(GeoColumn, into = c("Section1", "Section2"), sep = "\\(")%>% sepa
我是一名优秀的程序员,十分优秀!