将列表扩展为现有数据框中的列

Expanding lists as columns within an existing dataframe

提问人:Simms34 提问时间:9/29/2023 最后编辑:Simms34 更新时间:9/29/2023 访问量:59

问:

首先,我要说的是,我对R语言比较陌生,我是一个你可以称之为“蛮力”的学习者——我不学习这门语言,学习它,然后把它付诸实践。相反,我从适度的概念理解开始,然后通过谷歌和广泛的试验和错误相结合,为我试图完成的特定任务找到一个解决方案,并从每次经历中学习。因此,请原谅我的任何错误引用。但是我已经完成了当前任务的几个步骤,我发现自己现在已经接近尾声了。

底线问题是我有一个数据帧,其中包含几列包含列表,这些列表应该与其行中的 id 值相关联,但我不知道如何以我想要的方式将其全部解压缩。

# A tibble: 6 × 17
  id    start_date home_team away_team is_live is_popular sport league odds.1.sports_book_n…¹ odds.1.name odds.1.price odds.1.bet_points odds.1.is_main
  <chr> <chr>      <chr>     <chr>     <lgl>   <lgl>      <chr> <chr>  <list>                 <list>      <list>       <list>            <list>        
1 3404… 2023-09-2… Los Ange… San Fran… FALSE   FALSE      base… MLB    <chr [6]>              <chr [6]>   <int [6]>    <dbl [6]>         <lgl [6]>     
2 1481… 2023-09-2… Washingt… Atlanta … FALSE   FALSE      base… MLB    <chr [6]>              <chr [6]>   <int [6]>    <dbl [6]>         <lgl [6]>     
3 1216… 2023-09-2… Philadel… New York… FALSE   FALSE      base… MLB    <chr [28]>             <chr [28]>  <int [28]>   <dbl [28]>        <lgl [28]>    
4 2568… 2023-09-2… San Dieg… St. Loui… FALSE   FALSE      base… MLB    <chr [465]>            <chr [465]> <int [465]>  <dbl [465]>       <lgl [465]>   
5 4064… 2023-09-2… Oakland … Detroit … FALSE   FALSE      base… MLB    <chr [64]>             <chr [64]>  <int [64]>   <dbl [64]>        <lgl [64]>    
6 3854… 2023-09-2… Texas Ra… Seattle … FALSE   FALSE      base… MLB    <chr [66]>             <chr [66]>  <int [66]>   <dbl [66]>        <lgl [66]>    
# ℹ abbreviated name: ¹​odds.1.sports_book_name
# ℹ 4 more variables: odds.1.is_live <list>, odds.1.market_name <list>, odds.1.selection <list>, odds.1.selection_line <list>

背景故事:我正在查询一个体育赔率 API,它要求我在请求中传递 GameID。到目前为止,我已经设法:

  1. 从 API 中检索可用游戏的列表
  2. 将该响应子集到 GameID 的数据帧中
  3. 创建并运行一个单独的 API 调用,该调用循环访问 GameID 并返回嵌套列表中的所有数据 -- 使用 map()
  4. 使用 rrapply() 解压缩初始结果以获得上面所示的 tibble。

我觉得在这一点上这应该相当简单,但是我无法搜索正确的关键字组合,这显然将我指向了对我的特定情况有帮助的现有讨论。我尝试了各种 unlist、rbind、map_* 和其他功能,但无济于事。

第 1:9 列是特定于游戏的详细信息,需要保留。第 10:17 列是包含特定市场/线路的所有列表,需要根据它们当前关联的游戏进行扩展。就其价值而言,所有列表列的长度都应该相同。

非常感谢任何和所有的帮助。

编辑以添加 dput(head())...我切断了它,因为即使使用 head(),它也限制为六行顶级行,而不是列表行,列表行会很长。其他列表列也类似,但我还添加了 df 的屏幕截图,以防万一。

structure(list(id = c("34048-80389-2023-09-24-16", "14818-36174-2023-09-24-15", 
"12164-37900-2023-09-24-15", "25683-25135-2023-09-24-13", "40644-76765-2023-09-24-13", 
"38548-10478-2023-09-24-11"), start_date = c("2023-09-24T19:00:00-04:00", 
"2023-09-24T18:35:00-04:00", "2023-09-24T18:05:00-04:00", "2023-09-24T16:10:00-04:00", 
"2023-09-24T16:07:00-04:00", "2023-09-24T14:35:00-04:00"), home_team = c("Los Angeles Dodgers", 
"Washington Nationals", "Philadelphia Phillies", "San Diego Padres", 
"Oakland Athletics", "Texas Rangers"), away_team = c("San Francisco Giants", 
"Atlanta Braves", "New York Mets", "St. Louis Cardinals", "Detroit Tigers", 
"Seattle Mariners"), is_live = c(FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE), is_popular = c(FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE), sport = c("baseball", "baseball", "baseball", "baseball", 
"baseball", "baseball"), league = c("MLB", "MLB", "MLB", "MLB", 
"MLB", "MLB"), odds.1.sports_book_name = list(c("FanDuel", "FanDuel", 
"FanDuel", "FanDuel", "FanDuel", "FanDuel"), c("FanDuel", "FanDuel", 
"FanDuel", "FanDuel", "FanDuel", "FanDuel"), c("FanDuel", "FanDuel", 
"FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", 
"FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", 
"FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", 
"FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", 
"FanDuel", "FanDuel"), c("FanDuel", "FanDuel", "FanDuel", "FanDuel", 
"FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", 
"FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", 
"FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel", "FanDuel",

DF截图

r json 数据帧 列表

评论

1赞 LMc 9/29/2023
如果您将 的输出粘贴到您的问题中,那将会很有帮助。您现在发布它的方式,我们可以看到它们是列表列,但不是它们的内容。 将保留结构,并且很容易被那些试图提供帮助的人使用。dput(<your data frame>)dput
0赞 Mark 9/29/2023
嗨,Simms34,欢迎来到 Stack Overflow!如果 dput(df) 太大,那么 dput(head(df)) 会很好
0赞 r2evans 9/29/2023
由于第 10-17 列的长度似乎相同,因此您可以使用 .tidyr::unnest(df, 10:17)
1赞 Simms34 9/29/2023
也就是说,@r2evans建议非常有效......我知道这一定是相对简单的东西,哈哈。谢谢!!
1赞 Simms34 9/29/2023
@r2evans,在列表长度方面,我收集了尽可能多的信息,这就是为什么我想指出它们是相同的。鉴于这个特殊请求的性质,我还不担心必须处理不等的长度,但是当我这样做时,我相信我会回来的,哈哈

答: 暂无答案