2013-08-29 32 views
7

私はRが比較的新しいので、plyrパッケージからddply &の要約を使用しようとしています。 This postほとんど、私の質問には全く答えていません。私はいくつかの追加の説明/明確化を使用することができます。関数内でddplyを使用し、関心のある変数を引数として取り入れます。

私の問題:

私は与えられた変数のために、グループによって、記述統計を要約する簡単な関数を作成したいです。リンクされたポストとは違って、関数の引数として関心のある変数を含めたいと思います。すでにこのサイトで議論されているように、これは動作します:

require(plyr) 

ddply(mtcars, ~ cyl, summarise, 
    mean = mean(hp), 
    sd = sd(hp), 
    min = min(hp), 
    max = max(hp) 
) 

しかし、これはしていません:

descriptives_by_group <- function(dataset, group, x) 
{ 
    ddply(dataset, ~ group, summarise, 
    mean = mean(x), 
    sd = sd(x), 
    min = min(x), 
    max = max(x) 
) 
} 

descriptives_by_group(mtcars, cyl, hp) 

をので、私は働いていると、私はできるようにしたいデータの量の私に関心のある変数、データセットと変数のグループ化を指定できるようにする関数を持っています。

私は問題を解決するためにhereが見つかったさまざまな解決策を編集しようとしましたが、コードを正常に実行するのに十分理解していません。

元のポスターには、以下の例のデータセットを使用し:所望の出力と

a = c(1,2,3,4) 
b = c(0,0,1,1) 
c = c(5,6,7,8) 
df = data.frame(a,b,c) 
sv = c("b") 

を:

b Ave 
1 0 1.5 
2 1 3.5 

そしてハドリーによって承認溶液であった:

myFunction <- function(x, y){ 
NewColName <- "a" 
z <- ddply(x, y, .fun = function(xx,col){ 
         c(Ave = mean(xx[,col],na.rm=TRUE))}, 
      NewColName) 
return(z) 
} 

myFunction(df, sv)戻ります所望の出力。

基本的な仕組みをよりよく理解することで、コードを変更して関数に引数を渡すことができるかどうかを確認するためにコードを分割してみましたたとえば、 "NewColName"(情報を取得する変数)です。しかし、私は成功していません。私の難しさは、(xx[,col])で何が起きているのか分かりません。私は平均(xx [、col])は、データフレームxxのインデックスcolの列の平均をとるべきであることを知っています。しかし、私は無名関数がそれらの値をどこから読んでいるのか分かりません。

誰かがこれを解析するのを手伝ってもらえますか?私は非常に反復的なコードやサブセットを使って簡単に達成できる簡単な作業で数時間を無駄にしましたが、スクリプトをよりシンプルでエレガントにしようとしていました。その解決策。

PS私はpsychパッケージからdescribeBy関数を調べましたが、私が知る限り、値を返す変数を指定することはできず、結果的に問題は解決しません。

+0

「私は確信しています立つ。 'ddply'は、グループ化変数の文字ベクトルを受け取ります。 'ddply(data、c( 'var1'、 'var2')、...)のように。 – joran

+0

また、 'colwise'を見てください – hadley

+0

問題は' summarize'に渡される第3引数を得ていました。 –

答えて

7

私はあなたが与えた関数の例をいくつか移動し、複数の列を取り戻す方法を示しました。これはあなたが望むことをしますか?答えよりもコメントの

myFunction2 <- function(x, y, col){ 
z <- ddply(x, y, .fun = function(xx){ 
         c(mean = mean(xx[,col],na.rm=TRUE), 
         max = max(xx[,col],na.rm=TRUE)) }) 
return(z) 
} 

myFunction2(mtcars, "cyl", "hp") 
5

(もっと。関数内ddply(...,summarise, ...)を使用しているとき、私はあなたと難易度の同じレベルを持っていました。

descriptives_by_group <- function(dataset, group, x) 
    {aggregate(dataset[[x]], dataset[group], function(x) 
     c( mean = mean(x), 
      sd = sd(x), 
      min = min(x), 
      max = max(x) 
     )) 
    } 

descriptives_by_group(mtcars, 'cyl', 'hp') 
3

ちょうどas.quoted機能を使用します。)これは私が期待される道を働いていたベースのソリューションです。 dplyrのdevelのバージョンでquosuresの導入に伴い

simple_ddply <- function(dataset_name, variable_name){ 
    data <- ddply(dataset_name,as.quoted(variable_name), *remaining input)** 
0

以下の実施例は、(すぐ0.6.0を解放する)、これはここでもう少し簡単に

library(dplyr) 
descriptives_by_groupN <- function(dataset, group, x) { 

    group <- enquo(group) 
    x <- enquo(x) 

    dataset %>% 
     group_by(!!group) %>% 
     summarise(Mean = mean(!!x), 
       SD = sd(!!x), 
       Min = min(!!x), 
       Max = max(!!x)) 
} 

descriptives_by_groupN(mtcars, cyl, hp) 
# A tibble: 3 × 5 
# cyl  Mean  SD Min Max 
# <dbl>  <dbl> <dbl> <dbl> <dbl> 
#1  4 82.63636 20.93453 52 113 
#2  6 122.28571 24.26049 105 175 
#3  8 209.21429 50.97689 150 335 

となり、入力引数はquosuresに変換されますenquoで、group_by/summariseの中では、評価(!!またはUQ)を引用符で囲まないでください。

関連する問題