簡體   English   中英

將data.frame轉換為列表列表列表

[英]Converting data.frame to a list of list of list of lists

我正在使用所有具有不同參數的不同模型。 我很方便將它們存儲在數據庫中。 當我拉它們時,它們以我稱之為df數據幀的形式出現。

df ,有幾列有助於區分每個參數,以便每個(整個)行最終是唯一的。

例如

col_1 <- c("model_1", "model_1", "model_1", "model_1", "model_2", "model_2", "model_2", "model_2")
col_2 <- c("category_1", "category_1", "category_2", "category_2", "category_1", "category_1", "category_2", "category_2")
col_3 <- c("type_1", "type_2", "type_1", "type_2", "type_1", "type_2", "type_1", "type_2")
col_4 <- c("name_1", "name_2", "name_3", "name_4", "name_5", "name_6", "name_7", "name_8")
col_5 <- c("value_1", "value_2", "value_3", "value_4", "value_5", "value_6", "value_7", "value_8")
mat <- matrix(c(col_1, col_2, col_3, col_4, col_5), ncol = 5)
df <- data.frame(mat)
names(df) <- c("model", "category", "type", "name", "value")

我有興趣將df轉換為列表列表列表... - 將其deep_list - 以便可以像訪問每個參數值一樣

 parameter <- deep_list$model_1$category_2$type_2$name_4 

它應該給我value_4

我一直在閱讀這個帖子將data.frame轉換為列表列表,並試圖充分利用{plyr}中的dlply()函數

not_deep_list <- dlply(df,1,c)

或者也

not_list <- df %>% group_by(model)

我認為這是一個非常相似的問題(因此類似的標題)。

然而,它在某種意義上是不同的,它需要處理更多的“層”(即列)信息,因此deep_list名稱和標題......

歡迎任何建議(遞歸,循環,矢量化解決方案,函數從包 - 我從來沒有聽說過,...)

謝謝 !

首先,我在data.frame中指定了stringsAsFactors=FALSE - 這很重要,因為我使用split(...)來識別因子級別而不是因子值。 看看我的意思,跑吧

vec <- factor(c("apple"), levels=c("apple","banana"))
split(vec, vec)

# $apple
# [1] apple
# Levels: apple banana
# $banana
# factor(0)
# Levels: apple banana

好的 - 所以將字符串指定為非因子

df <- data.frame(mat, stringsAsFactors=FALSE)

嘗試這個自定義函數 - 它是遞歸的,如果length(split(..., ...)) > 1)調用自身 - 即,如果data.frame列的split(...)導致> 1 group,該函數將使用新參數i[,-1]調用自身。

recursive_split <- function(L) {
    L1 <- split(L, L[,1])
    if (length(L1) == 1) {
        L2 <- lapply(L1, function(i) i[,-1])
        return(L2)
    } else {
        lapply(L1, function(i) recursive_split(i[,-1])) 
    }
}

deep_list <- recursive_split(df)

# $model_1
# $model_1$category_1
# $model_1$category_1$type_1
# $model_1$category_1$type_1$name_1
# [1] "value_1"

# $model_1$category_1$type_2
# $model_1$category_1$type_2$name_2
# [1] "value_2"

# $model_1$category_2
# $model_1$category_2$type_1
# $model_1$category_2$type_1$name_3
# [1] "value_3"
# etc

deep_list$model_1$category_2$type_2$name_4
# [1] "value_4"

暫無
暫無

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

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