2016-09-21 19 views
4

私はリストにdata.frameオブジェクトを持っていますが、それぞれ最後の列(A.K.A、score)に基づいてフィルタリングします。リストのサブセットは私には直感的ですが、私は各data.frameオブジェクトのためのフィルタリングの結果として2つの異なるセット(すなわち、合格/不合格)を持ちたいと思います。私が使用した方法はエレガントではないと思っていますし、より効率的なソリューションを求めています。誰も私にどのようにこのようなタスクのためのよりエレガントなソリューションを達成するために私を指摘することができますどうもありがとう !リスト内の大きなdata.frameオブジェクトを効率的にサブセット化できますか?

おもちゃデータ:

mylist <- list(df1=data.frame(from=seq(1, by=4, len=16), to=seq(3, by=4, len=16), score=sample(30, 16)), 
       df2=data.frame(from=seq(3, by=7, len=20), to=seq(6, by=7, len=20), score=sample(30, 20)), 
       df3=data.frame(from=seq(4, by=8, len=25), to=seq(7, by=8, len=25), score=sample(30, 25))) 

私の最初の試み:

pass <- lapply(mylist, function(ele_) { 
    ans <- subset(ele_, ele_$score > 20) 
    ans 
}) 

は、私は、また、インスタンスがフィルタリング条件を満たし、かつ合格入れていないその逆のセットを持つようにしたい失敗判明します各data.frameオブジェクトに対して1つのリストに設定します。

希望する出力:各data.frameオブジェクトは、サブセット化した後にパス、フェイルセットを持つことができます。

リスト内に非常に大きなdata.frameオブジェクトがある場合、これを行うには何が良いですか?誰もがこのための便利なトリックを知っていますか?

答えて

6

data.tableオプションは、より効率的であるかもしれませ

library(data.table) 
lapply(mylist, function(x) setDT(x)[score > 20]) 

またはサブセットの上記の方法に加えてpurrr

library(dplyr) 
library(purrr) 
mylist %>% 
     map(filter, score > 20) 

からmapdplyrからfilterを使用各また、単一のデータセット(rbindlistからdata.tableまたはbind_rowsからdplyrに識別子列を含む)とサブセットをグループ化してrbindデータセットを作成することもできます。

rbindlist(mylist, idcol= 'grp')[score > 20, .SD , by = .(grp)] 

またはdplyr

mylist %>% 
    bind_rows(., .id = 'grp') %>% 
    group_by(grp) %>% 
    filter(score > 20) 

と意図は、( 'スコア' のための> 20と< 20)2のlistdata.frameを分離することである場合

lapply(mylist, function(x) split(x, c("FAIL", "PASS")[(x$score > 20)+1])) 
+0

@ Andy.Jian私はあなたのコメントを正しく理解しているかどうかはわかりません。あなたのコードをより効率的なものに置き換えることが問題だったと私は理解しています。 – akrun

+0

あなたのコードは効率的です。私は私のコメントを編集しました –

+0

@ Andy.Jian 'split 'を使って投稿を更新しました – akrun

関連する問題