gpt4 book ai didi

r - 调整功能以与 dplyr/magrittr 一起使用

转载 作者:行者123 更新时间:2023-12-02 05:36:19 26 4
gpt4 key购买 nike

我有:

df <- data_frame(
a = 1:2,
b = list(1:10, 4:40)
)

foo <- function(x) mean(unlist(x))

以下按预期工作:

df$b %>% foo

但是,我无法确定需要对 foo 进行哪些修改才能使 df %>% foo(b) 正常工作。

最佳答案

您可以将 ... 参数直接传递给 summarise_atvars 帮助程序,例如

foo <- function(.tbl, ...){
summarise_at(.tbl,
vars(...),
funs(mean(unlist(.))))
}

它适用于单个变量,列表列或不:

df %>% foo(b)
## # A tibble: 1 × 1
## b
## <dbl>
## 1 18.48936

或多个:

df %>% foo(a, b)
## # A tibble: 1 × 2
## a b
## <dbl> <dbl>
## 1 1.5 18.48936

要进一步了解 NSE,请查看 lazyeval ,这是 dplyr 用来实现其 NSE 的包。

另请注意,dplyr 的 SE/NSE 系统刚刚在开发版本中重建(尚未在 CRAN 上,尚未记录)。


奖励积分:全部在 R 基础上完成!

foo <- function(.tbl, ...){
# collect dots as character vector
cols <- as.character(substitute(list(...))[-1])
cls <- class(.tbl)

# handle grouped tibbles properly
if('grouped_df' %in% cls){
cls <- cls[which(cls != 'grouped_df')] # drop grouping
res <- aggregate(.tbl[cols],
.tbl[attr(.tbl, 'vars')],
FUN = function(x){mean(unlist(x))})
} else {
res <- as.data.frame(lapply(.tbl[cols], function(x){mean(unlist(x))}))
}

class(res) <- cls # keep class (tibble, etc.)
res
}

它适用于列表列、组和多个列或组,保持类但放弃分组:

df %>% foo(a, b)
## # A tibble: 1 × 2
## a b
## <dbl> <dbl>
## 1 1.5 18.48936

df %>% group_by(a) %>% foo(b)
## # A tibble: 2 × 2
## a b
## <int> <dbl>
## 1 1 5.5
## 2 2 22.0

mtcars %>% foo(mpg, hp)
## mpg hp
## 1 20.09062 146.6875

mtcars %>% group_by(cyl, am) %>% foo(hp, mpg)
## # A tibble: 6 × 4
## cyl am hp mpg
## <dbl> <dbl> <dbl> <dbl>
## 1 4 0 84.66667 22.90000
## 2 6 0 115.25000 19.12500
## 3 8 0 194.16667 15.05000
## 4 4 1 81.87500 28.07500
## 5 6 1 131.66667 20.56667
## 6 8 1 299.50000 15.40000

关于r - 调整功能以与 dplyr/magrittr 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42905811/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com