2016-04-06 12 views
1

Daha verimli depolama ve alma için bir veri çerçevesini yeniden şekillendirmeye çalışıyorum. Her satır, satırlar arasında benzersiz olmayan bir "ana" (anahtar) değeri ve bir alt değer (aslında, 3 öznitelik - 1 karakter ve 2 sayısal) kümesi içerir. Bu veri çerçevesini, her bir ana üst anahtar için yalnızca bir üst düzey girişe sahip bir listeye ve üst öğe ile ilişkilendirilen çocukların sayısına göre belirlenen bir dizi alt listeye dönüştürmek istiyorum. İşte bazı örnek veriler şunlardır: Bunun için çıkış adlandırılmış üyeleri $child ve $count (sub-listelerinin 4 üst düzey ("middle", "might", "million", "millions" adlandırılır) elemanları ve değişen sayılarla listesi olmamalıdırBir veri çerçevesini keyfi uzunluk listelerinin listesine nasıl verimli bir şekilde dönüştürebilirim?

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)) 

örn lookup4[["middle"]] alt içeriyor -lists $children[[1]]$child = "of", $count = 476 ve = "school"$children[[2]]$child, $count = 165).

Aşağıdaki kod çalışır, ancak çok yavaştır (8 GB RAM kullanarak 300.000 satırlık bir veri karesinde birkaç saat). Çıktı verisindeki çocukların sayısına 6 sınır koymuştum, ama büyük bir fark yaratmamış gibi görünüyor.

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' döngüsünü kaldırarak hızlandırabilir miyim? Eğer öyleyse, dönüşümü nasıl kodlarım?

+3

neler pcm mi? Lütfen küçük bir yeniden üretilebilir örnek ve çıktı alınabilir çıktı – akrun

+3

Lütfen önerilen bir soru göndermek için http://stackoverflow.com/help/mcve~~pobj okuyun –

+1

'split (pcm [, c (" child "," count "," prob ")], pcm $ parent) 'ilk adım olmalıdır. Sonra, birden çok satır içeren bir 'data.frame' yerine birçok alt listeye sahip olmanın nedeni nedir? Bölünmüş (...) 'nin çıktısının yeterli olması gerektiğini düşünüyorum. – nicola

cevap

0

bu deneyin:

Ben dataframe parents denir varsayalım:

parents.list <- as.list(as.data.frame(t(parents))) 

listenin isimleri olması ebeveynlerin satır adlarını isterseniz:

parents.list <- setNames(split(parents, seq(nrow(parents))), rownames(parents)) 
+0

Teşekkürler Felipe, ama bunlar istediğimi yapmıyor. Her bir üst düzey liste öğesinin adı, 'ebeveynlerin' benzersiz bir değeri olmalıdır. Kısa bir süre örnek vereceğim. – AltShift

İlgili konular