我试图在dplyr和base r函数中汇总数据,但没有得到预期的结果,请告诉我为什么

例如,在下面的dplyr示例中,我try 将字符串作为列名,它很有效

map(c('Sepal.Length'), function(x) {
browser()  
  x <- sym(x)
  iris %>% group_by(Species) %>% summarise(mean=mean( !!x ))
})


[[1]]
# A tibble: 3 × 2
  Species     mean
  <fct>      <dbl>
1 setosa      5.01
2 versicolor  5.94
3 virginica   6.59

但是,如果我使用Aggregate之类的基数r函数try 相同的方法,则失败

map(c('Sepal.Length'), function(x) {
  # browser()  
  x <- sym(x)
  aggregate(!!x ~ Species, data=iris, FUN= mean)
})


Error in `map()`:
ℹ In index: 1.
Caused by error in `!x`:
! invalid argument type

推荐答案

不能在基R公式中使用!!运算符(也称为注入运算符或bang-bang运算符或double-bang运算符)-它不是基R语法的一部分,而是特定于某些tidyverse函数的基R语法的扩展.它只能在数据屏蔽参数、动态点或inject内部使用.在这些上下文之外,如果您试图使用它来消除引用符号,您将得到一个错误.如果你在R控制台中输入?rlang::`topic-inject-out-of-context` ,你可以阅读更多.

您可以使用以R为基数的reformulate来轻松地从字符串变量构建公式:

purrr::map(c('Sepal.Length'), function(x) {
  aggregate(reformulate('Species', x), data = iris, FUN = mean)
})
#> [[1]]
#>      Species Sepal.Length
#> 1     setosa        5.006
#> 2 versicolor        5.936
#> 3  virginica        6.588

R相关问答推荐

如何使用文本表达来子集数据

R中的枢轴/转置

使用rlang s arg_match判断函数输入列表

ggplot geom_smooth()用于线性回归虚拟变量-没有回归线

如何 bootstrap glm回归、估计95%置信区间并绘制它?

如何按排序顺序打印一个框架中所有精确的唯一值?

获取列中值更改的行号

如何动态更新selectizeInput?

将小数分隔符放在R中的前两位数字之后

提取一个列表中单个列的重复观察结果R

绘制采样开始和采样结束之间的事件

将一个字符串向量调整为与其他字符串向量完全相同的大小

如何对r中包含特定(未知)文本的行求和?

按组内中位数分类

防止正则表达式覆盖以前的语句

Ggplot2如何找到存储在对象中的残差和拟合值?

ggplot斜体轴刻度标签中的单个字符-以前的帖子建议不工作

在不带max()的data.table中按组查找最后一个元素

识别部分重复行,其中一行为NA,其重复行为非NA

R,将组ID分配给另一个观测ID变量中的值的组合