我在包裝函數中使用ddply
(來自包的R
)。我想基於變量的值來總結我的數據集。但是,wrap函數必須定義我想要彙總的變量。在函數內部使用ddply(非標準評估)
如果沒有包裝的功能,我可以採取以下方法:
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))
,但它沒有區別。
只是在函數中變成'd < - ddply(df,。(get(v)),summarize,mean = mean(b),var = var(b))''。 –
@RonakShah,你是對的!我沒有想到它可能如此簡單。你有沒有解釋爲什麼在函數內部調用沒有'get()'的'v'不會讓我獲得變量的值? –
'sumpun'內的'ddply(df,v,summary,mean = mean(b),var = var(b))作用於'plyr'中定義的dot'.'函數用於收集所有引用變量後來的評估,請參閱'?plyr ::。'和[這個vignette](https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html) – OdeToMyFiddle