2016-06-15 5 views
1

私は、フィルタ条件の文字列をdata.tableに渡すことについて助けが必要だと考えていました。だから、フィルタ文字列をR data.tableをフィルタリングする文字列を評価するには?

iris <- data.table(iris) 

vars <- 'setosa'      
filter <- 'Species == vars & Petal.Length >= 4' 

data <- iris[filter, list(
          sep.len.tot = sum(Sepal.Length) 
         , sep.width.total = sum(Sepal.Width) 
      ), by = 'Species'] 

:私はアイリスデータセットを使用した例を再作成しようとした解析とのevalのすべてのマナーを試してみた、と

をそれを把握するように見えることはできませんvars(ループに基づいて変化する)変数があります。私はフィルタ文字列に基づいてデータをフィルタリングしようとしています。

文字列を評価するdata.table固有のメソッドはありますか?

希望は意味があります!

答えて

3

私はeval(parse(text()))と思っていますが、いくつかの変更が必要です。

library(data.table) 
iris <- data.table(iris) 

#Updated so it will have quotes in your string 
vars <- '\"setosa\"' 
#Update so you can change your vars 
filter <- paste0('Species==',vars,'& Petal.Length >= 4') 

res <- iris[eval(parse(text=filter)), list(
    sep.len.tot = sum(Sepal.Length) 
    , sep.width.total = sum(Sepal.Width) 
), by = 'Species'] 

いくつかの注意事項:私はそれが正しく実行されますので、その文字列に引用符があるだろう、と私はまた、あなたが動的にvarsを変更することができfilterを更新し、あなたのvarsを更新し、これを試してみてください。

最後に、説明の目的のために、結果のDFは空白です(何setosa種がPetal.Length> = 4を持っていないので、だから、この作品を見るために、私たちは最後の条件を削除することができます。

filter <- paste0('Species==',vars) 
res2 <- iris[eval(parse(text=filter)), list(
    sep.len.tot = sum(Sepal.Length) 
    , sep.width.total = sum(Sepal.Width) 
), by = 'Species'] 

res2 
    Species sep.len.tot sep.width.total 
1: setosa  250.3   171.4 

EDIT:以下フランクさんのコメント@パー 、クリーナーのアプローチは、式として全体のことを書くことです:

filter <- substitute(Species == vars, list(vars = "setosa")) 

res <- iris[eval(filter), list(
    sep.len.tot = sum(Sepal.Length) 
    , sep.width.total = sum(Sepal.Width) 
), by = 'Species'] 
+0

ああを使用することができます!本当にありがとう! – AlexP

+2

貼り付けや解析を行うのではなく、式を置き換える方がきれいだと思います。私は 'filter < - substitute(Species == vars&Petal.Length> = 4、list(vars =" setosa "))を意味します。アイリス[eval(filter)] ' – Frank

+1

ああ、あなたがそれをすることができるかどうかは分かりませんでした。私は私の答えを編集します、ありがとう@フランク! –

0

あなたはつまり、あなたのフィルタを貼り付け、引用符を追加する必要がありfilter <- paste0('Species==\'',vars,'\' & Petal.Length >= 4')

次に、あなたは多くの意味を作る

eval(parse(text=paste0('iris[',filter,',list(sep.len.tot = sum(Sepal.Length), sep.width.total = sum(Sepal.Width)), by = \'Species\']'))) 
+0

これはあなたに空のテーブルを与えた場合、データにpetal.length> = 4のセトサが存在しないためです。 – jkt

関連する問題