2017-03-08 7 views
0

ラップ関数の中でddplyRplyrパッケージから)を使用しています。変数の値に基づいてデータセットを要約したいと思います。しかし、wrap関数はどの変数を要約するかを定義する必要があります。ddply inside関数を使用する(非標準評価)

ラップ機能がなければ、私は次のようなアプローチを取ることができます:行動を行いなぜ

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 

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 

しかし、ラップ機能を使用して、私は同じ結果を得ることはありません関数内で使用すると、ddplyの値は異なりますか?関数内でsubstitute(v)eval(substitute(v))を使用しようとしましたが、違いはありません。

+1

関数内の 'd < - ddply(df、。(get(v))、summarize、mean = mean(b)、var = var(b))に変更するだけです。 –

+0

@RonakShah、あなたは絶対に正しいです!私はそれがとても簡単かもしれないとは考えていませんでした。 wrap関数の中で 'get()'を使わずに 'v'を呼び出すと変数の値が得られないのはなぜですか? –

+2

'' plyr'で定義されたドット '.'関数は、' sumfun'の内部で 'ddply(df、v、summarize、mean = mean(b)、var = var(b))'関数が使用されます。後で評価するには '?plyr ::。'と[this vignette](https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html)を参照してください。 – OdeToMyFiddle

答えて

1

plyrパッケージ及びそのddply機能は、種類の時代遅れと(tidyverseとして参照)dplyrtidyrと同様のパッケージへと進化しています。

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_に存在

あなたが達成しようとしているのは何
# library(tidyverse) 
library(dplyr) 

は次のように翻訳することができます標準的な評価を行う。詳細については、vignette("nse")を参照してください。

+0

私はかなり使い慣れていません[パイプ](http://r4ds.had.co.nz/pipes.html)とパイプ演算子( '%>%')はまだありません。しかし、この場合、パイプの可読性は向上するようです。 –

関連する問題