2017-02-05 9 views
1

私は大規模なデータセットの統計を行うためのWebインターフェイスを作成しています。ウィジェットを使用すると、変数とグループを選択できます。各変数は、実行可能な一種の統計に関連付けられています。 Webページは適切なデータフレームを設定して「集約」に渡し、次にさまざまな出力に渡すRスクリプトを呼び出します。ここのデータは関係ないので、私はそれを含めていません。変数の置換と貼り付けによる集約への引数の割り当て

私の問題は、私は理解できない理由のために出て爆撃された「集約」への柔軟な入力である:stvarは=「意味」場合、これは正常に動作

group variable “grp” 
str(grp) 
'data.frame': 1573 obs. of 1 variable: 
$ Loc: Factor w/ 4 levels "ED","ICU","Trans",..: 1 1 1 1 1 1 1 1 1 4 ... 

Time variable 
TimeBase <- “year” 

data 
str(tmp) 
'data.frame': 554 obs. of 4 variables: 
$ Loc  : Factor w/ 4 levels "ED","ICU","Trans",..: 4 1 1 1 4 4 1 1 4 4 ... 
$ year : Factor w/ 7 levels "2011","2012",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ ActivLag: num 3 -2 0 1 17 210 19 -7 0 107 ... 
$ ScanLag : num 80 12 5 8 159 255 28 109 11 111 ... 

aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, paste0(stvar), na.rm = TRUE, na.action = na.pass) 

が、stvar =「合計場合"は引数としてna.rmを取らず、動作しません。だから、私は次のことを試してみました:

仕事とfollwoingエラーを与えていない
statstrg <- ifelse(stvar %in% c("sum", "prop","frel", "median"), " na.action = na.pass", " na.rm = TRUE, na.action = na.pass") 
aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, paste0(stvar), paste0(statstrg)) 

Error in if (na.rm) x <- x[!is.na(x)] else if (any(is.na(x))) return(x[FALSE][NA]) : 
argument is not interpretable as logical 

aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, paste0(stvar), na.action = na.pass) 

がstvar =「合計」のために仕事をしていても。

引数を解析する集計に必要なコンマを処理する方法がないため、na.rmとna.action = na.passのそれぞれに条件付き文字列の割り当てと貼り付け(var)を使用することはできません。私はpaste()の引数のさまざまな組み合わせを渡そうとしましたが、集約は個々の引数を見たいと思っています。だから、誰かが私の方が良い方法を教えてくれる?どうも。

+0

関数 'sum()'もこの 'na.rm = T/F'引数をとります。bdw –

答えて

0

式が文字列で動的に生成することができますが、関数内のパラメータの割り当ては、オプションの引数、そのデフォルト値NULLあるaggregate()na.rmna.actionとして文字列から構築することができません。

条件付きstvarに応じて2つの異なるaggregate()コールを割り当てることを検討:空のを割り当てることができないので、代わりifelseifを用いて必要とするTRUEまたはNULLに条件付き可変st_narmを割り当てる、あるいは

if (stvar %in% c("sum", "prop", "frel", "median")) { 
    aggdf <- aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, 
         FUN = stvar, na.action = na.pass) 
} else { 
    aggdf <- aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, 
         FUN = stvar, na.rm = TRUE, na.action = na.pass) 
} 

値にオブジェクトを代入します(置換の長さの失敗)。

if(stvar %in% c("sum", "prop","frel", "median")){ 
    st_narm <- NULL 
} else { 
    st_narm <- TRUE 
} 

aggdf <- aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, 
        FUN = stvar, na.rm = st_narm, na.action = na.pass) 
0

ありがとうございました!この問題は解決されますが、それぞれを完了するために取ります:

1) "集計"は引数として "sum"を取らず、na.rmは合計ではなく "集計"から渡されます()とsumとna.rmの両方が同時に渡された場合はエラーとなります。

2)if-then st_narm < - NULLメソッドでエラーが発生しました。if(na.rm)x < - x [!is.na(x)]のエラーelse if(any(is.na (x)))return(x [FALSE] [NA]): 引数の長さはゼロです。だからうまくいかなかった。

3)完全な "集約"文字列を含む条件は、うまく機能しませんでしたが、何とかしてあまりエレガントではありません。しかし、仕事を終わらせる。

Thx再び。オープンソースコミュニティが大好き!

+0

大です。そして、両方のソリューションをサンプルデータでテストしたところ、どちらも機能しました。それはあなたが得るエラーで特定のデータでなければなりません。どの集団fct。 * sum *、* median *、* quantile *などのエラーを引き起こしますか?おそらく、* NULL *の代わりに* FALSE *を試してみてください。また、それらは文字列ではなく 'aggregate()'メソッド呼び出しです。 – Parfait

関連する問題