2017-01-12 6 views
0

私はしきい値でリスト内のdata.frameを評価する必要があり、csvファイルとしてエクスポートする必要があったdata.frameの新しいグループを取得しようとしています。しかし、各data.frameを与えられた閾値で分類した後、resultは入れ子になったリストになります。おそらく、これらの結果のネストされたリストをdata.frameのリストとして操作し、data.frameリストをループしてcsvというファイルとしてエクスポートする必要があります。結果のネストされたリストを溶かすためにreshape2を使用しましたが、必要に応じてそれらをグループ化し、それらを必要な方法でエクスポートする方法はわかりません。どのように私はdata.frameリストを作るために入れ子リストを操作する簡単な方法を指摘することができますか?これをどうすればいいのですか?これを行うための効率的な方法はありますか?どうもありがとう:)操作を簡単にするためにネストされたリストのdata.frameを単純化する方法はありますか?

これはdata.frameリスト再生可能な入力です:

myList <- list(
    hotan = data.frame(begin=seq(1, by=6, len=25), end=seq(4, by=6, len=25), pos.score=sample(30, 25)), 
    aksu = data.frame(begin=seq(3, by=9, len=30), end=seq(6, by=9, len=30), pos.score=sample(45, 30)), 
    korla = data.frame(begin=seq(6, by=8, len=45), end=seq(11, by=8, len=45), pos.score=sample(52, 45)) 
) 

私はこのようなネストされたリストにその結果が、閾値と各data.frameを評価する必要があります。

rslt <- lapply(myList, function(x) { 
    res <- split(x, ifelse(x$pos.score >=18, "good","bad")) 
}) 

library(reshape2) 
melt(rslt) 

perhap:

私は、ネストされたリスト構造を削除するためにmeltを使用しようとしましたs、ネストされたリストから最初に出て、rsltをdata.frameのリストにキャストし、lapplyを使用してそれぞれをcsvというファイルとしてエクスポートします。どんな考えですか?

編集

私は、おそらくdata.tableまたはdplyrは、この種の問題を治療するために、より優れた機能を提供しunlistを使用して、ネストされたリストに対処する一般的な方法を知っています。新しいソリューションで学びたい。おかげ

私はこのdata.frameリストを達成しようとしています:

hotan.good 
hotan.bad 
aksu.good 
aksu.bad 
korla.good 
korla.bad 

はどうすればcsvファイルとしてエクスポートすることが必要とされる所望のdata.frameリストを達成することができますか? rsltはどのように操作できますか?

+0

'unlist(rslt、recursive = FALSE)' –

+0

@Apom私はこれを知っています、私は面白いものを探しています。 – Dan

答えて

1

を私は@MarkusN続ける場合は」(あるいはデータフレームのリストにそれを分割します。)溶液(彼の助けに感謝):

library(dplyr) 
DF <- bind_rows(myList, .id="sample") %>% 
    mutate(threshold = ifelse(pos.score >=18, "good", "bad")) %>% 
    split(list(.$threshold,.$sample)) 
mapply(write.csv, DF, paste0(getwd(), names(DF), ".csv")) 

このように、ネストされたリストにdata.frameをエクスポートすることははるかに簡単かつ効率的にすることができます。

1

書き込みhotan.good.csvhotan.bad.csvaksu.good.csv、...既存の./out/フォルダへ:

library(magrittr) 
l <- unlist(rslt, recursive = FALSE) 
l %>% 
    names() %>% 
    lapply(FUN = function(f) write.csv(l[[f]], paste0("out/", f, ".csv"), row.names = FALSE)) %>% 
    invisible() 
2

なぜあなたは、データフレームのリストを使用するようにしたいですか?あなたは簡単に1つのデータフレーム内のすべてのデータを置くことができます。

library(dplyr) 
df = bind_rows(myList, .id="name") 
# new Variable threshold 
df %>% mutate(threshold = ifelse(pos.score >=18, "good", "bad")) 

今あなたがフィルタを選択し、あなたのデータを、このデータフレームの中にでき

+0

@Dan単一のdata.frameのサブセットを、dplyrの 'group_by'またはdata.tableの' by = 'でチャンクで評価することができます。あなたが知っている並列処理の計画がこれらの性能を上回らない限り、私は単一のオブジェクトに固執します。 (消えるコメントへの返信...) – Frank

関連する問題