gpt4 book ai didi

r - 从 R 中的列表列表构建数据框的最佳方法

转载 作者:行者123 更新时间:2023-12-04 09:38:33 27 4
gpt4 key购买 nike

我有一个希望转换为数据框(特别是小标题)的子列表列表;例如:

myList <- list(
list(var1=1,var2=2,var3=3,var4=4,var5=5,var6=6),
list(var1=4,var2=5,var3=6,var4=7,var5=8,var6=9),
list(var1=7,var2=8,var3=9,var4=1,var5=2,var6=3)
)

使用以下代码,我可以将所选变量提取到 tibble 数据框
myDF <- tbl_df(cbind(
var1 = lapply(myList, '[[', "var1"),
var2 = lapply(myList, '[[', "var2"),
var5 = lapply(myList, '[[', "var5"),
var6 = lapply(myList, '[[', "var6")
))

但它非常冗长。是否有更简洁的方法(可能使用 purrr 映射函数)可以将选定的子元素从每个列表中拉出并将它们填充到一行中?

此外,如果子列表本身包含列表,如何最好地提取这些列表的元素;例如:
 myList <- list(
list(var1=1,var2=2,var3=3,list4=list(varA="a",varB="b")),
list(var1=4,var2=5,var3=6,list4=list(varA="c",varB="d")),
list(var1=7,var2=8,var3=9,list4=list(varA="e",varB="f"))
)

我怎样才能得到类似以下的工作:
myDF <- tbl_df(cbind(
var1 = lapply(myList, '[[', "var1"),
var2 = lapply(myList, '[[', "var2"),
var4 = lapply(myList, '[[', "list4$varA")
))

我想从列表 4 中提取特定元素,但使用 $ 表示法向下钻取到下一个级别不起作用?

最佳答案

由于数据框只是列表,如果您的列表没有嵌套多次。

library(tidyverse)
myList %>%
map(as.data.frame) %>%
bind_rows() %>%
select(var1, var2, var5, var6)

# var1 var2 var5 var6
# 1 1 2 5 6
# 2 4 5 8 9
# 3 7 8 2 3

甚至是以下内容, bind_rows()实际上适用于列表列表。
myList %>%
bind_rows() %>%
select(var1, var2, var5, var6)

# var1 var2 var5 var6
# <dbl> <dbl> <dbl> <dbl>
# 1 1.00 2.00 5.00 6.00
# 2 4.00 5.00 8.00 9.00
# 3 7.00 8.00 2.00 3.00

但是有时可能是每个列表元素只有一些公共(public)元素,而您只想选择那些特定的元素
myList %>%
map(as.data.frame) %>%
map(~ select(.x, var1, var2, var5, var6)) %>%
bind_rows()

# var1 var2 var5 var6
# 1 1 2 5 6
# 2 4 5 8 9
# 3 7 8 2 3

对于列表嵌套不止一次的情况,使用 flatten() 进行调查。来自 purrr
myList2 <- list(
list(var1=1,var2=2,var3=3,list4=list(varA="a",varB="b")),
list(var1=4,var2=5,var3=6,list4=list(varA="c",varB="d")),
list(var1=7,var2=8,var3=9,list4=list(varA="e",varB="f"))
)

myList2 %>%
map(flatten) %>%
bind_rows()

# var1 var2 var3 varA varB
# <dbl> <dbl> <dbl> <chr> <chr>
# 1 1.00 2.00 3.00 a b
# 2 4.00 5.00 6.00 c d
# 3 7.00 8.00 9.00 e f

并申请 select()根据需要,名称将是各个元素的名称。对不同元素中的重复名称要非常小心,因为它只需要一个。

在某些情况下, enframe()函数来自 tibble也很有用。

关于r - 从 R 中的列表列表构建数据框的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48608195/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com