我正在学习如何使用R包collapse
来处理数据。collapse
的语法与dplyr
相似,函数名也相似。下面是一个例子。两个代码块都工作得很好。但是由于两个包都包含函数across
。我想知道第二个代码块是否实际上使用dplyr
中的across
函数。
library(dplyr)
library(collapse)
# Group by cyl, then calculate mean for each columns using dplyr
mtcars %>%
group_by(cyl) %>%
summarise(across(.fns = mean))
# # A tibble: 3 × 11
# cyl mpg disp hp drat wt qsec vs am gear carb
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 4 26.7 105. 82.6 4.07 2.29 19.1 0.909 0.727 4.09 1.55
# 2 6 19.7 183. 122. 3.59 3.12 18.0 0.571 0.429 3.86 3.43
# 3 8 15.1 353. 209. 3.23 4.00 16.8 0 0.143 3.29 3.5
# Group by cyl, then calculate mean for each columns using collapse
mtcars %>%
fgroup_by(cyl) %>%
fsummarise(across(.fns = fmean))
# cyl mpg disp hp drat wt qsec vs am gear carb
# 1 4 26.66364 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909 0.7272727 4.090909 1.545455
# 2 6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 0.4285714 3.857143 3.428571
# 3 8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 0.1428571 3.285714 3.500000
然后我尝试了下面的代码,从collapse
包中指定across
函数,但是它导致了一个错误。mtcars %>%
fgroup_by(cyl) %>%
fsummarise(collapse::across(.fns = fmean))
fsummarise(。在(,崩溃::。FNS = fmean)):
表达式需要以across()或其简写方式命名或开始acr () .
collapse::across
导致错误显示across
不在collapse
包中。
collapse::across
错误:'across'不是从'namespace:collapse'导出的对象
collapse:::across
给出的函数如下:
function (.cols = NULL, .fns, ..., .names = NULL, .apply = "auto",
.transpose = "auto")
{
stop("across() can only work inside fmutate() and fsummarise()")
}
<bytecode: 0x0000018a76156648>
<environment: namespace:collapse>
但是下面的操作仍然失败。
mtcars %>%
fgroup_by(cyl) %>%
fsummarise(collapse:::across(.fns = fmean))
fsummarise(。在(崩溃:::。FNS = fmean)):
表达式需要以across()或其简写方式命名或开始acr () .
我想知道为什么collapse::across
不能导出函数,以及是否有替代方案可以在特定的包中指定函数。
在collapse中,across()
是一个内部函数,只能在fsummarise()
和fmutate()
内部使用。它可以用acr()
缩写。它在fsummarise
和fmutate
之外没有任何用途,因此不需要导出(这避免了与dplyr和我必须创建facross()
之类的名称空间冲突)。
由于fsummarise()
和fmutate()
惰性求值表达式,它们将检测到across()
正在传递,并且将始终使用折叠版本。它们不支持dplyr::across()
,也不打算解析像collapse:::across()
这样的东西,这是危险和多余的。
所以如果collapse没有附加,使用collapse::fsummarise(across(...))
就足够了。