2017-08-11 10 views
0

関数の側でdata.tableの列名に引数を渡すにはどうすればよいですか? たとえば、 'hours'と 'location'という列を持つdata1というデータがあります。出力では、外れ値を場所別に検索し、「時間」で名前を付けることにします。私はsubstitute(y)などを使用しようとしました。出力は常に列名として 'y'を使用します。誰か助けてくれますか?ありがとうございました。ユーザー定義関数の引数をdata.tableの列名にするにはどうすればいいですか?

mf<-function(data, y){ 
newy<-as.name(deparse(substitute(y))) 
output<-data[,.(y=boxplot.stats(eval(newy))$out),by=.(location)] 
return(output) 
} 
mf(data=data1,y=hours) 
+0

良い例を作成する方法については、https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/28481250#28481250を参照してください。 – Frank

答えて

0

カラムを選択するための文字値をとる関数を記述することをお勧めします。この場合、あなたの関数のように書き換えることができます:boxplot.statsの出力をサブセットする[を使用することにより

mf <- function(data, y){ 
    output <- data[, boxplot.stats(get(y))['out'], by = .(location)] 
    setnames(output, 'out', y) 
    return(output) 
} 

、一つの要素('out')名前付きリストが返されます。したがってoutputには、2つの列、locationoutがあります。それでに与えられたものになるようにoutを変更するだけです。

例:あなたはそれから何かを得ることができる場合

set.seed(100) 
data1 <- data.table(
    location = state.name, 
    hours = rpois(1000, 12) 
) 
mf(data = data1, y = 'hours') 
#   location hours 
# 1:  Delaware 25 
# 2:  Georgia 21 
# 3:   Idaho  4 
# 4: Massachusetts  5 
# 5:  Missouri  7 
# 6: South Carolina  5 
# 7: South Carolina  6 
# 8: South Dakota 20 
# 9:   Texas  5 
# 10:   Utah 22 

非標準な評価は難しいと努力だけの価値があります。 data.tableは、舞台裏で最適化に使用します。 tidyverseパッケージは、データベース内での処理を可能にするためにこのパッケージを使用します。メリットがない場合(引用符をいくつか入力する必要はありません)、コストがかかります。

+0

ありがとうNathan Werth、あなたのコードが動作します。 eval()の問題を指摘してくれたことを感謝します。ここの例は単純化されており、場所と時間だけがあります。実際のコードでは、ウィスカーの終点(boxplot(hours)$ stats [5])がもう1つあります。その結果、私は[アウト]を使用することができませんでした。しかし、私はboxplot(hours)$ outを行い、setnames(出力、 'V1'、y)を使ってV1列の名前を変更しました。ありがとうございました。 – DrX

+0

ところで、この問題の解決策を提供していただきありがとうございます。 R関数の引数の列を引用符で囲むのは珍しいことです。 – DrX

関連する問題