在函数内部使用ddply(非标准评估)
Using ddply inside function (non-standard evaluation)
我在包装函数中使用 ddply
(来自 R
中的 plyr
包)。我想根据变量的值总结我的数据集。但是,wrap 函数必须定义我要汇总的变量。
没有换行功能,我可以采用以下方法:
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
功能有些过时并演变为 dplyr
、tidyr
和类似的包(引用为 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")
。
我在包装函数中使用 ddply
(来自 R
中的 plyr
包)。我想根据变量的值总结我的数据集。但是,wrap 函数必须定义我要汇总的变量。
没有换行功能,我可以采用以下方法:
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
功能有些过时并演变为 dplyr
、tidyr
和类似的包(引用为 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")
。