【问题标题】:convert named list with mixed content to data frame将具有混合内容的命名列表转换为数据框
【发布时间】:2021-12-19 17:35:27
【问题描述】:

有没有更好更好的方法将具有混合内容的命名列表转换为数据框?

工作示例:

my_list <- list("a" = 1.0, "b" = "foo", "c" = TRUE)

my_df <- data.frame(
  "key" = names(my_list),
  stringsAsFactors = F
)

my_df[["value"]] <- unname(my_list)

是否可以一步完成转换?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们可以从base R使用stack

    stack(my_list)
    

    根据?stack

    stack 函数用于将数据框或列表中作为单独列可用的数据转换为可用于方差分析模型或其他线性模型的单列。 unstack 函数反转此操作。


    或者enframe

    library(tidyverse)
    enframe(my_list) %>% # creates the 'value' as a `list` column
       mutate(value = map(value, as.character)) %>% # change to single type
       unnest 
    

    【讨论】:

    • 嗨@akun,stack 简单快捷,但我没有找到帮助文档。你想添加包名(base?)还是稍微解释一下?
    • @Jiaxiang 来自base R。根据?stackThe stack function is used to transform data available as separate columns in a data frame or list into a single column that can be used in an analysis of variance model or other linear model. The unstack function reverses this operation.。在这里,它是一个命名列表。因此,它取消列出值,同时将列表的名称复制为单独的列
    • @akrun 如果我理解正确,stack 解决方案还需要使用colnames 将列名称更改为 keyvalue?没有其他技巧可以在一次操作中做到这一点吗?
    • @RSzT 您可以使用setNames(stack(my_list)[2:1], c("key", "value")) 作为默认列以“ind”和“值”命名,其中enframe 可以选择更改参数中的名称
    • @akrun 似乎ind 列(或上面的key)是一个因素。
    【解决方案2】:

    您可以使用dplyr::as_tibble 将列表强制转换为数据框/小标题。这将自动创建一个数据框,其中列表的名称是列名,列表项对应于行。

    library(dplyr)
    library(tidyr)
    
    my_list <- list("a" = 1.0, "b" = "foo", "c" = TRUE)
    
    as_tibble(my_list)
    #> # A tibble: 1 x 3
    #>       a b     c    
    #>   <dbl> <chr> <lgl>
    #> 1     1 foo   TRUE
    

    要重塑为您拥有的两列格式,请将其通过管道传输到 tidyr::gather,其中默认列名称是键和值。由于value 列中的数据类型不同,这会将所有值强制转换为字符。

    as_tibble(my_list) %>%
      gather()
    #> # A tibble: 3 x 2
    #>   key   value
    #>   <chr> <chr>
    #> 1 a     1    
    #> 2 b     foo  
    #> 3 c     TRUE
    

    reprex package (v0.2.1) 于 2018 年 11 月 9 日创建

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 2017-05-23
      • 1970-01-01
      相关资源
      最近更新 更多