【问题标题】:R: create a data.frame or data.table from a list and unpacked list of listsR:从列表和解包列表创建 data.frame 或 data.table
【发布时间】:2021-05-02 09:23:25
【问题描述】:

我有一个 list 和一个 list of lists,并且想创建一个 data.framedata.table。

这是列表

 head(stadte_namen)
[1] "Berlin"            "Hamburg"           "München"  

和一个列表列表

> head(result)
[[1]]
       min      max
x 13.22886 13.54886
y 52.35704 52.67704

[[2]]
        min      max
x  9.840654 10.16065
y 53.390341 53.71034

[[3]]
       min      max
x 11.36078 11.72291
y 48.06162 48.24812

如何创建具有以下结构的 data.framedata.table

name                xmin        ymin        xmax       ymax

Berlin              13.22886    52.35704    13.54886   52.67704
Hamburg             9.840654    53.390341   10.16065   53.71034
München             11.36078    48.06162    11.72291   48.24812
...

这是数据:

stadte_namen<-c("Berlin", "Hamburg", "München", "Köln", "Frankfurt am Main", 
"Stuttgart")

result<-list(structure(c(13.2288599, 52.3570365, 13.5488599, 52.6770365
), .Dim = c(2L, 2L), .Dimnames = list(c("x", "y"), c("min", "max"
))), structure(c(9.840654, 53.390341, 10.160654, 53.710341), .Dim = c(2L, 
2L), .Dimnames = list(c("x", "y"), c("min", "max"))), structure(c(11.360777, 
48.0616244, 11.7229083, 48.2481162), .Dim = c(2L, 2L), .Dimnames = list(
    c("x", "y"), c("min", "max"))), structure(c(6.7725303, 50.8304399, 
7.162028, 51.0849743), .Dim = c(2L, 2L), .Dimnames = list(c("x", 
"y"), c("min", "max"))), structure(c(8.4727933, 50.0155435, 8.8004716, 
50.2271408), .Dim = c(2L, 2L), .Dimnames = list(c("x", "y"), 
    c("min", "max"))), structure(c(9.0386007, 48.6920188, 9.3160228, 
48.8663994), .Dim = c(2L, 2L), .Dimnames = list(c("x", "y"), 
    c("min", "max"))))

【问题讨论】:

    标签: r dataframe data.table purrr


    【解决方案1】:

    你也可以试试

    l <- result
    df <- data.frame(t(sapply(l,c)))
    colnames(df) <- c("minX", "minY", "maxX", "maxY"); df
    df$stadte_namen <- c("Berlin", "Hamburg", "München", "Köln", "Frankfurt am Main", 
                         "Stuttgart");df
    

    回答

           minX     minY      maxX     maxY      stadte_namen
    1 13.228860 52.35704 13.548860 52.67704            Berlin
    2  9.840654 53.39034 10.160654 53.71034           Hamburg
    3 11.360777 48.06162 11.722908 48.24812           München
    4  6.772530 50.83044  7.162028 51.08497              Köln
    5  8.472793 50.01554  8.800472 50.22714 Frankfurt am Main
    6  9.038601 48.69202  9.316023 48.86640         Stuttgart
    

    【讨论】:

    • 谢谢!一个很好的解决方案,因为它不使用依赖项。
    【解决方案2】:

    使用lapplypurrr

    library(dplyr)
    library(purrr)
    
    data <- lapply(result, function(x) c(xmin = x[1,1],
                                         xmax = x[1,2],
                                         ymin = x[2,1],
                                         ymax = x[2,2])) %>%
            purrr::map_dfr(~.x)
    
    data$stadte_namen <- stadte_namen
    
    # A tibble: 6 x 5
       xmin  xmax  ymin  ymax stadte_namen     
      <dbl> <dbl> <dbl> <dbl> <chr>            
    1 13.2  13.5   52.4  52.7 Berlin           
    2  9.84 10.2   53.4  53.7 Hamburg          
    3 11.4  11.7   48.1  48.2 München          
    4  6.77  7.16  50.8  51.1 Köln             
    5  8.47  8.80  50.0  50.2 Frankfurt am Main
    6  9.04  9.32  48.7  48.9 Stuttgart
    

    【讨论】:

      【解决方案3】:

      stadte_namen 指定为result 的名称,并将数据帧绑定到一个数据帧中。您可以使用pivot_wider 获取宽格式数据。

      library(tidyverse)
      
      map_df(setNames(result, stadte_namen), ~.x %>% 
               as.data.frame %>%
               rownames_to_column('row'), .id = 'name') %>%
        pivot_wider(names_from = row, values_from = c(min, max))
      
      #  name              min_x min_y max_x max_y
      #  <chr>             <dbl> <dbl> <dbl> <dbl>
      #1 Berlin            13.2   52.4 13.5   52.7
      #2 Hamburg            9.84  53.4 10.2   53.7
      #3 München           11.4   48.1 11.7   48.2
      #4 Köln               6.77  50.8  7.16  51.1
      #5 Frankfurt am Main  8.47  50.0  8.80  50.2
      #6 Stuttgart          9.04  48.7  9.32  48.9
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-15
        • 2010-11-10
        • 1970-01-01
        • 2021-05-14
        • 2015-09-20
        • 2014-07-23
        • 2021-09-12
        相关资源
        最近更新 更多