【问题标题】:Nested list with mutiple levels to data.frame in RR中data.frame的多级嵌套列表
【发布时间】:2020-10-29 02:42:39
【问题描述】:

从 API 中,我得到了一个复杂且大的列表,该列表深度嵌套,并且包含 ueven 个元素。

我使用 map 来获取我想要的数据,但我想将结果列表转换为数据框,请参见下面的代码。有什么指点吗?

# Example structure
list <- list(
  Player1 = c("D" = "2020-05-13",
              "T" = "Test 1",
            c("Common" = list(c("X" = 300,
                         "Y" = 345,
                         "Z" = 500)))),
  Player2 = c("D" = "2020-05-13",
            "T" = "Test 2",
            c("Common" = list(c("X" = 320,
                                "Y" = 365,
                                "Z" = 300)))))

# Desired output 
df <- data.frame(
  player = c("Player1", "Player 2"),
  D = c("2020-05-13", "2020-05-13"),
  T = c("Test 1", "Test 2"),
  X = c(300, 320),
  Y = c(345, 365),
  Z = c(500, 300))

【问题讨论】:

    标签: r json list dictionary nested


    【解决方案1】:

    您可以使用类似的方法将 api 响应直接转换为数据帧。你可以试试。

    response <- POST(url,body  = arg, encode = "json")
    cwr_json <- fromJSON(httr::content(response, "text"), flatten = TRUE)
    df <- data.frame(cwr_json)
    

    【讨论】:

      【解决方案2】:

      使用purrr 包的方法。

      library(purrr)
      
      map_dfr(list1, as.data.frame, .id = 'player')
      
      

      【讨论】:

        【解决方案3】:

        在 Base-R 中

        as.data.frame(t(sapply(list,unlist)))
        
                         D      T Common.X Common.Y Common.Z
        Player1 2020-05-13 Test 1      300      345      500
        Player2 2020-05-13 Test 2      320      365      300
        

        【讨论】:

          【解决方案4】:

          使用来自tidyrunnest_wider

          library(tidyr)
          library(tibble)
          tibble(col1 = list, player = names(col1)) %>% 
               unnest_wider(c(col1)) %>%
               unnest_wider(c(Common))
          # A tibble: 2 x 6
          #  D          T          X     Y     Z player 
          #  <chr>      <chr>  <dbl> <dbl> <dbl> <chr>  
          #1 2020-05-13 Test 1   300   345   500 Player1
          #2 2020-05-13 Test 2   320   365   300 Player2
          

          【讨论】:

            猜你喜欢
            • 2017-12-06
            • 2016-06-17
            • 2018-04-05
            • 2015-02-03
            • 2021-02-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-14
            • 1970-01-01
            相关资源
            最近更新 更多