私は、より効率的な格納と検索のためにデータフレームを再形成しようとしています。各行には、行間で一意ではない「親」(キー)値と子値(実際には、1つの文字と2つの数値の3つの属性のセット)が含まれます。このデータフレームを、一意の親キーごとに1つのトップレベルエントリと、親に関連する子の数によって決定される複数のサブリストを持つリストに変換したいと考えています。ここではいくつかのサンプルデータです:データフレームを効率的に任意の長さのリストに変換する方法はありますか?
pcm <- data.frame(parent = c("middle", "middle", "might", "might",
"might", "million", "million", "millions"),
child = c("of", "school", "be", "have", "not", "in",
"to", "of"),
count = c(476, 165, 1183, 619, 321, 490, 190, 269))
このため出力は("middle", "might", "million", "millions"
命名)4トップレベルの要素を持つリストであること、および名前のメンバー$child
と$count
でサブリストの番号を変える必要があります(たとえば、lookup4[["middle"]]
は、サブが含まれています - リスト$children[[1]]$child
= "of"
,$count
= 476
および$children[[2]]$child
= "school"
,$count
= 165
)。
以下のコードは動作しますが、極端に遅くなります(8 GB RAMを使用する300,000行のデータフレームで数時間)。私は出力データに含まれる子供の数に6という制限を課しましたが、大きな違いはありませんでした。
lookup4 <- list()
parents <- unique(pcm$parent)
n.parents <- length(parents)
for (i in 1:n.parents) {
words <- pcm$child[pcm$parent == parents[i]]
counts <- pcm$count[pcm$parent == parents[i]]
probs <- pcm$prob[pcm$parent == parents[i]]
n.children <- min(c(NROW(words), 6)
ngram.tail <- list()
for (k in 1:n.children) {
ngram.tail[[k]] <- list(word = words[k],
count = counts[k],
prob = probs[k])
}
lookup4[[parents[i]]] <- list(children = ngram.tail)
}
'for'ループを削除することでスピードアップできますか?もしそうなら、私は変換をどのようにコード化しますか?
何'pcm'ですか?小さな再現可能な例とexxpected出力を表示してください – akrun
推奨される質問を投稿するには、http://stackoverflow.com/help/mcveを読んでください。 –
split(pcm [、c( "child"、 "count"、 "prob" )]、pcm $ parent) 'が最初のステップになります。次に、複数の行を持つ 'data.frame'の代わりに多くのサブリストを持つ理由は何ですか?私は 'split(...)'の出力が十分であるはずだと思います。 – nicola