【问题标题】:Create one data frame out of different list columns从不同的列表列中创建一个数据框
【发布时间】:2019-02-07 10:21:18
【问题描述】:

我已将json 文件导入R。现在我有一个具有唯一标识符dbc 的字符列,后跟多个包含数据框的列表列lookup.company.year。我想做的是制作一个大的小标题(数据框)。我更喜欢使用 purrr 包的解决方案。

这只是我的一小部分数据:

# A tibble: 1 x 5
  dbc       lookup.CZ.2016       lookup.CZ.2017       lookup.DSW.2016      lookup.DSW.2017     
  <chr>     <list>               <list>               <list>               <list>              
1 019999006 <data.frame [1 × 2]> <data.frame [1 × 2]> <data.frame [1 × 2]> <data.frame [1 × 2]>

用一个可重现的例子:

library(tidyverse)

df <- structure(list(dbc = "019999006", lookup.CZ.2016 = list(structure(list(
    name = "MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten)", 
    price = 18575.66), class = "data.frame", row.names = 1L)), 
    lookup.CZ.2017 = list(structure(list(name = "Albert Schweitzer Ziekenhuis", 
        price = 23024.57), class = "data.frame", row.names = 1L)), 
    lookup.DSW.2016 = list(structure(list(name = "MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten)", 
        price = 21991L), class = "data.frame", row.names = 1L)), 
    lookup.DSW.2017 = list(structure(list(name = "Albert Schweitzer Ziekenhuis", 
        price = 23603.59), class = "data.frame", row.names = 1L)), 
    lookup.Menzis.2018 = list(NULL)), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame"))

以及期望的结果:

# A tibble: 4 x 5
  dbc      company year name                                            price
     <dbl> <chr> <dbl> <chr>                                              <dbl>
1 19999006 CZ     2016 MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten) 18576.
2 19999006 CZ     2017 Albert Schweitzer Ziekenhuis                      23025.
3 19999006 DSW    2016 MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten) 21991 
4 19999006 DSW    2017 Albert Schweitzer Ziekenhuis                      23604.

我也有NULL 值。我想排除那些,这就是我在示例数据集中包含一个的原因。

更新

除了NULL之外,我如何才能从数据集中排除空的list()

非常感谢您的帮助!

【问题讨论】:

    标签: r list purrr


    【解决方案1】:

    这是通过tidyverse 的方式(不需要purrr),

    library(tidyverse)
    
    df %>% 
     gather(var, val, -dbc) %>% 
     group_by(grp = sub('^.*\\.(.*)\\..*', '\\1', var)) %>% 
     filter(val != 'NULL') %>% 
     unnest()
    

    给出,

    # A tibble: 4 x 5
    # Groups:   grp [2]
      dbc       var             grp   name                                               price
      <chr>     <chr>           <chr> <chr>                                              <dbl>
    1 019999006 lookup.CZ.2016  CZ    MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten) 18576.
    2 019999006 lookup.CZ.2017  CZ    Albert Schweitzer Ziekenhuis                      23025.
    3 019999006 lookup.DSW.2016 DSW   MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten) 21991 
    4 019999006 lookup.DSW.2017 DSW   Albert Schweitzer Ziekenhuis                      23604.
    

    【讨论】:

    • tidyverse 不也加载purrr
    • @mtoto 是的。连同所有 Hadley 的包裹。我只是没有使用它的任何功能
    • 运行我的原始数据集时,它会运行此错误:Error: Each column must either be a list of vectors or a list of data frames [val] 这可能是因为除了列表向量和NULL 值之外,我还有list() 值。如何排除这些?
    • 所以你有嵌套列表?大概就是这样。您可以手动排除它们吗?很多吗?
    • 除了空的list() 之外,我没有看到不一致的地方吗?
    猜你喜欢
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多