r语言 - 使用 ddply 内部函数(非标准评估)



我在包装函数中使用ddply(来自Rplyr包)。我想根据变量的值汇总我的数据集。但是,包装函数必须定义我要汇总的变量。

如果没有包装函数,我可以采用以下方法:

require(plyr)
# Create sample dataframe:
sample_df <- data.frame(a = rep(1:3, 2), b = rep(3:1, 2), c = rep(c("a", "b"), 3))
sample_df
a b c
1 1 3 a
2 2 2 b
3 3 1 a
4 1 3 b
5 2 2 a
6 3 1 b
# Use ddply to summarize the dataframe:
ddply(sample_df, .(a), summarize, mean = mean(b), var = var(b))
a mean var
1 1    3   0
2 2    2   0
3 3    1   0

但是,使用包装函数,我没有得到相同的结果:

sumfun <- function(df, v) { # summarize a given dataframe by a given variable, 
d <- ddply(df, .(v), summarize, mean = mean(b), var = var(b))
return(d)
}
# Output using the function:
sumfun(sample_df, "a")
v mean var
1 a    3  NA

为什么在函数中使用ddply的行为会有所不同?我尝试在函数中使用substitute(v)eval(substitute(v)),但这并没有区别。

plyr包及其ddply功能已经过时,并演变为dplyrtidyr和类似的包(引用为tidyverse)。

# library(tidyverse)
library(dplyr)

您要完成的内容可以这样翻译:

sample_df %>% 
group_by(a) %>% 
summarize(mean = mean(b), var = var(b))
# # A tibble: 3 × 3
#       a  mean   var
#   <int> <dbl> <dbl>
# 1     1     3     0
# 2     2     2     0
# 3     3     1     0

并且,对于函数方法:

sumfun <- function(df, v) {
df %>% 
group_by_(v) %>% 
summarize(mean = mean(b), var = var(b))
}
sumfun(sample_df, 'a')
# # A tibble: 3 × 3
#       a  mean   var
#   <int> <dbl> <dbl>
# 1     1     3     0
# 2     2     2     0
# 3     3     1     0

请注意执行标准评估所需的函数中group_by_最终_。有关详细信息,请参阅vignette("nse")

最新更新