gpt4 book ai didi

r - 在函数中使用 dplyr,非标准评估

转载 作者:行者123 更新时间:2023-12-04 18:02:57 27 4
gpt4 key购买 nike

试图让我的头脑周围Non-Standard Evaluation as used by dplyr但没有成功。我想要一个简短的函数,它返回一组指定变量的汇总统计数据(N、平均值、标准差、中值、IQR、最小值、最大值)。

我的函数的简化版本...

my_summarise <- function(df = temp,
to.sum = 'eg1',
...){
## Summarise
results <- summarise_(df,
n = ~n(),
mean = mean(~to.sum, na.rm = TRUE))
return(results)
}

并使用一些虚拟数据运行它......
set.seed(43290)
temp <- cbind(rnorm(n = 100, mean = 2, sd = 4),
rnorm(n = 100, mean = 3, sd = 6)) %>% as.data.frame()
names(temp) <- c('eg1', 'eg2')
mean(temp$eg1)
[1] 1.881721
mean(temp$eg2)
[1] 3.575819
my_summarise(df = temp, to.sum = 'eg1')
n mean
1 100 NA

N 是计算出来的,但是平均值不是,不知道为什么。

最终,我希望我的功能更通用,沿着......
my_summarise <- function(df = temp,
group.by = 'group'
to.sum = c('eg1', 'eg2'),
...){
results <- list()
## Select columns
df <- dplyr::select_(df, .dots = c(group.by, to.sum))
## Summarise overall
results$all <- summarise_each(df,
funs(n = ~n(),
mean = mean(~to.sum, na.rm = TRUE)))
## Summarise by specified group
results$by.group <- group_by_(df, ~to.group) %>%
summarise_each(df,
funs(n = ~n(),
mean = mean(~to.sum, na.rm = TRUE)))
return(results)
}

...但在我进入这个更复杂的版本之前(我使用 this example 作为指导)我需要首先在简单版本中进行评估,因为这是绊脚石,调用 dplyr::select()工作正常。

感谢有关我哪里出错的任何建议。

提前致谢

最佳答案

基本思想是您必须自己实际构建适当的调用,使用 lazyeval 最容易完成。包裹。

在这种情况下,您希望以编程方式创建一个类似于 ~mean(eg1, na.rm = TRUE) 的调用。 .这是如何:

my_summarise <- function(df = temp,
to.sum = 'eg1',
...){
## Summarise
results <- summarise_(df,
n = ~n(),
mean = lazyeval::interp(~mean(x, na.rm = TRUE),
x = as.name(to.sum)))
return(results)
}

当我努力让事情正常工作时,我会这样做:
  • 请记住,就像 ~n() 一样您已经有了,调用必须以 ~ 开头.
  • 使用实际变量编写正确的调用,看看它是否有效( ~mean(eg1, na.rm = TRUE) )。
  • 使用 lazyeval::interp重新创建该调用,并通过仅运行 interp 来检查这一点直观地看到它在做什么。

  • 在这种情况下,我可能会经常写 interp(~mean(x, na.rm = TRUE), x = to.sum) .但是运行它会给我们 ~mean("eg1", na.rm = TRUE)正在治疗 eg1作为字符而不是变量名。所以我们使用 as.name ,正如在 vignette("nse") 中教给我们的那样.

    关于r - 在函数中使用 dplyr,非标准评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40017629/

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