2016-05-14 14 views
0

私はy変数の下でカテゴリ "a"と "b"の平均値と中央値を見つけようとしています。この計算を行うための関数を記述しようとしています。これは、サンプルデータセット以下の通りです:関数の引数としてカラム名を渡す - R

sample_data <- data.frame(x = 1:10, y = c("a","b")) 
library(data.table) 
sample_data_dt <- as.data.table(sample_data) 

私は、次の方法を試してみましたが、私はdata.tableとdata.frameの両方で関数のパラメータとしての列名を渡すために任意のエレガント/シンプルな方法を見つけることができないのです。

data.table sample_data_dtための一つの作業スクリプトは次のとおりです。

apply_statistics_4 <- function(df, on_col, by_col){ 
df[, list(mean_value = mean(get(on_col)), median_value = median(get(on_col))), by = get(by_col)]} 
apply_statistics_4(sample_data_dt, "x", "y") #works 

しかし、同様のスクリプトがddply機能にdata.frameのために動作しません:

apply_statistics_5 <- function(df, on_col, by_col){ 
ddply(df,.(get(by_col)), summarize, mean1 = mean(get(on_col)), median1 = median(get(on_col)))} 
apply_statistics_5(sample_data, "x", "y") #Does not work 
# Error in get(by_col) : object 'y' not found 

私が見つかりつの作業スクリプトdata.frame ddply機能を使用すると、次のとおりです。

apply_statistics <- function(df, on_col, by_col){ 
df$y1 <- eval(substitute(by_col), df) 
df$x1 <- eval(substitute(on_col), df) 
ddply(df,.(y1), summarize, mean1 = mean(x1), median1 = median(x1))} 
d <- apply_statistics(sample_data, x, y) #Works 

あなたが他のメタを発見された場合Data.tableとdata.frameの両方のRの関数パラメータとしてカラム名を使用する場合は、説明と分かち合ってください。

ありがとうございました。次のように

+0

[こちら](http://stackoverflow.com/questions/10178203/sending-in-column-name-to-ddply-from-function) – akrun

+2

'data.table'については、 (平均値.SD [1L])、中央値=中央値(.SD [1L]))、by = by_col、 .SDcols = on_col] } '' ddply'の別のリンクは[こちら]です(http://stackoverflow.com/questions/6584030/using-ddply-inside-a-function) – akrun

+1

@akrun - ありがとうございますこの入力を共有する。これは本当に役に立ちます。 – skumar

答えて

0

ddplyの問題ですが、機能環境に関係するものではないようです。私はここでいくつかのテストを行いました。グローバル環境で変数を定義すると、ddplyは結果を受け入れて取得できますが、その文字列を関数に変数として渡すと何か不思議なことが起こります。

m <- "x" 
n <- "y" 
apply_statistics_5 <- function(df, m, n){ 
    ddply(df, n, summarise, mean1 = mean(get(m)), median1 = median(get(m))) 
} 
apply_statistics_5(sample_data, "x", "y") 
    y mean1 median1 
1 a  5  5 
2 b  6  6 

mnは、地球環境に存在しない場合、これは動作しません。

更新: それはplyrパッケージのがhere言及スコープの問題とは何かを持っているかもしれません。

+0

返信ありがとうございます。これは本当に便利です。 – skumar

0

あなたが列名を参照することができます両方のタイプの(同一ではないが)、同様に動作

sample_data[["y"]] 
sample_data_dt[["y"]] 

別のコマンドは、例えば、subsetであります

on_col <- "x" 
subset(sample_data, select=get(on_col)) 
subset(sample_data_dt, select=get(on_col)) 
by_col <- "y" 
subset(sample_data, subset=get(by_col)=="a") 
subset(sample_data_dt, subset=get(by_col)=="a") 

行番号がdata.tablesubsetのバージョンとベースRバージョンによって異なる出力であるが、(data.tableがはるかに速い勿論であるが)それ以外の場合はかなり交換可能であることに留意されたいです。

+0

あなたの入力を共有していただきありがとうございます。これは本当に役に立ちます。 – skumar

関連する問題