如何将键值对列表转换为 Dataframe ?

nwnhqdif  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(127)

请注意,我正在处理的输入形状与这些类似问题中的不同:R list of lists to data.frameConverting a list of lists to a dataframe in R: The Tidyverse-way
我正在使用一个web API,它以这种形状返回结果

listOfListsOfKeyVals <- lapply(1:5, function(i){
    list(
      col1 = i,
      col2 = runif(1)
    )
})

您可能认为以下方法会奏效

do.call(rbind, listOfListsOfKeyVals)

但仔细观察,结果实际上是一个列表的 Dataframe

do.call(rbind, listOfListsOfKeyVals) |> tibble()

# A tibble: 5 × 1
  `do.call(rbind, listOfListsOfKeyVals)`[,"col1"] [,"col2"]
  <list>                                          <list>   
1 <int [1]>                                       <dbl [1]>
2 <int [1]>                                       <dbl [1]>
3 <int [1]>                                       <dbl [1]>
4 <int [1]>                                       <dbl [1]>
5 <int [1]>                                       <dbl [1]>

我想出了下面的解决办法

foreach(x = listOfListsOfKeyVals, .combine = rbind) %do% {
  as.data.frame(x)
} |> tibble()

但对于大型数据集来说,这是令人痛苦的慢。有更好的办法吗?

zzoitvuj

zzoitvuj1#

我想你是在找dplyr::bind_rows

library(dplyr)

set.seed(12)
listOfListsOfKeyVals <- lapply(1:5, function(i){
  list(
    col1 = i,
    col2 = runif(1)
  )
})

bind_rows(listOfListsOfKeyVals)

输出:

# A tibble: 5 × 2
   col1   col2
  <int>  <dbl>
1     1 0.0694
2     2 0.818 
3     3 0.943 
4     4 0.269 
5     5 0.169
nbysray5

nbysray52#

另一个选项是rrapply

rrapply::rrapply(listOfListsOfKeyVals, how = "bind")

#   col1       col2
# 1    1 0.21794909
# 2    2 0.81600287
# 3    3 0.04631368
# 4    4 0.10518273
# 5    5 0.46489659

和一个基本R选项,带有matrix

l <- listOfListsOfKeyVals
data.frame(matrix(unlist(l), nrow = length(l), byrow = TRUE)) |>
  setNames(names(l[[1]]))

相关问题