【问题标题】:Dataframe into list with a specific format数据框到具有特定格式的列表中
【发布时间】:2021-05-18 14:59:39
【问题描述】:

我一直在尝试将数据框放入具有特定格式的列表中以使用下游功能,但我失败了。无论数据框大小如何,它都必须工作。

具体来说,我需要的是转这些数据框:

mycolours <- data.frame(Group=c("Group1","Group2"),
                       Colour=c("#F8766D","#7CAE00"))

mycolours2 <- data.frame(Group=c("Group1","Group2","Group3","Group4"),
                       Colour=c("#F8766D","#7CAE00","#00BFC4","#C77CFF"))

进入这些列表:

mycolours <- list(Group = c(Group1 = "#F8766D", Group2 = "#7CAE00"))
mycolours2 <- list(Group = c(Group1 = "#F8766D", Group2 = "#7CAE00", Group3 = "#00BFC4", Group4 = "#C77CFF"))

我已经尝试了一些解决方案,它们在一定程度上确实有效,但它们的格式不够具体,无法在下游工作。在其他解决方案中,我已经尝试过 mycolours &lt;- split(mycolours, seq(nrow(mycolours)))mycolours &lt;- purrr::transpose(mycolours)(格式错误)和 mycolours &lt;- lapply(as.list(1:dim(mycolours)[1]), function(x)df[x[1],])(返回错误:object of type 'closure' is not subsettable)。

谢谢!

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    一个看起来很糟糕的解决方案,但它可以让你到达那里:

    library(tidyverse)
    list(mycolours %>%
           group_split(row_number(), .keep = FALSE) %>% 
           map(., ~ .x$Colour) %>% 
           unlist %>% 
           set_names(., mycolours$Group)) %>% 
      set_names(select(mycolours, matches("Group")) %>% names())
    # $Group
    #    Group1    Group2 
    # "#F8766D" "#7CAE00" 
    

    我们可以把它变成一个函数,让它更美观:

    df_to_list_function <- function(df, colour_variable, grouping_variable) {
      grouping_name <- select(df, matches(grouping_variable)) %>% names()
      list(df %>%
             group_split(row_number(), .keep = FALSE) %>%
             map(., ~ .[[colour_variable]]) %>%
             unlist %>%
             set_names(., df[[grouping_variable]])) %>%
        set_names(grouping_name)
    }
    

    然后调用它:

    df_to_list_function(mycolours, "Colour", "Group")
    # $Group
    #    Group1    Group2 
    # "#F8766D" "#7CAE00" 
    
    df_to_list_function(mycolours2, "Colour", "Group")
    # $Group
    #    Group1    Group2    Group3    Group4 
    # "#F8766D" "#7CAE00" "#00BFC4" "#C77CFF" 
    

    【讨论】:

    • 很有魅力!谢谢!
    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多