2017-03-08 38 views
0

我在包裝函數中使用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)),但它沒有區別。

+1

只是在函數中變成'd < - ddply(df,。(get(v)),summarize,mean = mean(b),var = var(b))''。 –

+0

@RonakShah,你是對的!我沒有想到它可能如此簡單。你有沒有解釋爲什麼在函數內部調用沒有'get()'的'v'不會讓我獲得變量的值? –

+2

'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

回答

1

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")

+0

我還沒有完全過渡到使用還有[pipe](http://r4ds.had.co.nz/pipes.html)和管道操作符('%>%')。但是,在這種情況下,管道的可讀性似乎更好。 –