2016-05-31 4 views
0

データフレーム内の一部のデータを特定の文字列で分割して頻度を数えたいとします。stringiとrbindを使用してlapplyを使用する

いくつかの方法で悩んだ後、私は方法を考え出しましたが、結果にはわずかな誤差があります。

例:

データフレームのデータファイル:

data 
abc hello 
hello 
aaa 
zxy 
xyz 

一覧:

list 
abc 
bcd 
efg 
aaa 

私のコード:この例では

lapply(list$list, function(x){ 
    t <- data.frame(words = stri_extract(df$data, coll=x)) 
    t<- setDT(t)[, .(Count = .N), by = words] 
    t<-t[complete.cases(t$words)] 
    result<-rbind(result,t) 
    write.csv(result, "new.csv", row.names = F) 
}) 

私はCSV Fiが期待されますル以下の結果を得:

words Count 
abc  1 
aaa  1 

しかし、私のコードで私が得た:

words Count 
aaa  1 

私はstri_extractは私がrbindを使用するときに、おそらくエラーが発生abc helloabcを識別する必要があります知っていますか?

+0

参照: 'stringi :: stri_list2matrix' – gagolews

答えて

3

write.csvファイルをループから移動する必要があります。そうしないと、以前に保存されたファイルが上書きされ、最後の段階で保存されます。これにより、関数内のresult変数を変更することができないため、lapply以外の結果はrbindになります。

result <- do.call(rbind, lapply(list$list, function(x){ 
           t <- data.frame(words = stri_extract(df$data, coll=x)) 
           t<- setDT(t)[, .(Count = .N), by = words] 
           t<-t[complete.cases(t$words)] 
           t 
})) 

write.csv(result, "new.csv", row.names = F) 
+0

おかげで、非常に有用 –

+0

あなたはAPPEND = Tでループ内write.csvていませんでしたか?それはおそらくちょうどプロセスをとにかく遅くするだろう、私は一度だけ書いて、ちょうど –

+0

を実行可能な解決策です質問する必要があります。あなたは先に進み、試してみることができます。パフォーマンスについては不明です。 – Psidom

関連する問題