簡體   English   中英

如何有效地將數據幀轉換為任意長度的列表列表?

[英]How to efficiently convert a data frame to a list of lists of arbitrary length?

我正在嘗試重塑數據框,以便更有效地存儲和檢索。 每行包含一個“父”(鍵)值,它在行之間不是唯一的,而是一個子值(實際上,一組3個屬性 - 1個字符和2個數字)。 我想將此數據幀轉換為一個列表,該列表只包含每個唯一父鍵的一個頂級條目,以及由與父項關聯的子項數確定的多個子列表。 以下是一些示例數據:

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

此輸出應該是一個包含4個頂級元素(名為"middle", "might", "million", "millions" )的列表,以及具有命名成員$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'循環加快速度嗎? 如果是這樣,我將如何編碼轉換?

嘗試這個:

我想數據框稱為parents

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

如果您希望父項的行名稱是列表的名稱:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM