2016-08-04 7 views
-1

ユーザー入力を使用してサブセット化したいデータフレームがあります。ユーザーは、3つのフィールド(サブセットへのデータフレーム、サブセット条件、および選択する列)を含むファイルを送信します。 file.txt例ラインは次のようになりますデータフレームをサブセット化するときに文字列をオブジェクトおよびサブセットとして使用する方法

"mtcars","mpg > 21 & hp > 100","" 

は、データフレームmtcarsを使用mpg > 21hp > 100持つすべてのそれらのサブセット、およびすべての列を選択します。

あなたは、それが論理的な文としてquery$V2を認識しないので、これは動作しません

subset(as.name(query$V1), query$V2) 

subsetを実行

query <- read.csv("file.txt", header=F, stringsAsFactors=F) 

でこれを読み込むことができ、それが検出されません。 as.name(query$V1)の列。そんなことは可能ですか?これを行うより良い方法はありますか?私は、ファイル入力を通じてユーザーがデータフレームに対して複数のサブセット/クエリを実行できるようにする必要があります。

+1

あなたと確実に知ることは困難'mtcars'は組み込みのデータセットですが、yesです。これは単純な' mtcars'のものです。 'eval(parse(text =" subset(mtcars、mpg> 21&hp> 100) "))' –

+0

'これはうまくいくようです – TomNash

答えて

0

dplyr機能の標準評価版は、あなたがこの中にはeval(パース(テキスト=))によって許可された任意のコード実行の同じ種類を許可していない行うことができ

library(dplyr) 

# Read user input 
user_input <- data_frame("mtcars","mpg > 21 & hp > 100", "cyl, mpg, hp") %>% 
    as.list() 

# Find user specified data.frame 
out <- get(user_input[[1]]) 

# Filter data by user input 
if (user_input[[2]] != '') { 
    out <- out %>% 
    filter_(.dots = user_input[[2]]) 
} 

# Select user specified cols 
if (user_input[[3]] != '') { 
    # assuming the col names are comma separated 
    user_input[[3]] <- unlist(strsplit(user_input[[3]], ',')) 
    out <- out %>% 
    select_(.dots = user_input[[3]]) 
} 

out 
+0

私は考え方が好きで、このようなものも考えていますが、用語を分けることができる複数の演算子があり、いくつかはグループ化することができます。サブセット文字列全体を1つのアドレスにすることは、すでに正しくフォーマットされた入力を切り詰めないことが最善です。もちろん、あなたのケースの 'user_input [[2]]が正しくフォーマットされているかどうか確認する必要があります。 – TomNash

+0

フィルタは論理演算子を実際に扱うことができるので、サブセット式を切り詰める必要はありません。私はそれに応じて答えを編集しました。 –

関連する問題