当第一个索引代表行时如何处理列表的列表?
How to deal with lists of lists when the first index represents rows?
如何将列表列表转换为 DataFrame,其中第一个 "layer" 列表应该是行?
myList = list(
list(name="name1",num=20,dogs=list("dog1")),
list(name="name2",num=13,dogs = list()),
list(name="name3",num=5,dogs=list("dog2","dog4"))
)
我的第一个想法是取消列出 "third layer"
中的元素
myUnList = sapply(myList,function(x){y=x;y$dogs = unlist(y$dogs);y})
我可以创建一个 tibble
tibble(myUnList)
# A tibble: 3 x 1
myUnList
<list>
1 <list [3]>
2 <list [2]>
3 <list [3]>
请注意,如果我用 myList[[1]]
来表示 name
的向量,那会很简单,但我在如何整理以其他方式呈现的数据方面遇到了麻烦。我虽然关于使用 purrr
到 "invert" 订单。
预期结果:
# A tibble: 3 x 3
names num dogs
<list> <list> <list>
1 <chr [1]> <dbl [1]> <list [1]>
2 <chr [1]> <dbl [1]> <list [0]>
3 <chr [1]> <dbl [1]> <list [2]>
是否有其他类型的数据结构支持可变长度条目?
我们可以使用 purrr
包中的 map
函数提取列表元素,然后使用 data_frame
创建一个新的 tibble。
图书馆(tidyverse)
dat <- data_frame(name = map_chr(myList, "name"),
num = map_dbl(myList, "num"),
dogs = map(myList, "dogs"))
dat
# # A tibble: 3 x 3
# name num dogs
# <chr> <dbl> <list>
# 1 name1 20.0 <list [1]>
# 2 name2 13.0 <NULL>
# 3 name3 5.00 <list [2]>
如果您希望所有内容都在列表列中,请将 map_chr
和 map_dbl
替换为 map
。
dat <- data_frame(name = map(myList, "name"),
num = map(myList, "num"),
dogs = map(myList, "dogs"))
dat
# name num dogs
# <list> <list> <list>
# 1 <chr [1]> <dbl [1]> <list [1]>
# 2 <chr [1]> <dbl [1]> <NULL>
# 3 <chr [1]> <dbl [1]> <list [2]>
在尝试 purrr
一段时间后,我找到了另一个不需要输入名称的解决方案(对于非常大的列表可能会很麻烦)。
myList %>% transpose %>% simplify_all %>% tbl_df
结果
# A tibble: 3 x 3
name num dogs
<chr> <dbl> <list>
1 name1 20 <list [1]>
2 name2 13 <list [0]>
3 name3 5 <list [2]>
purrr
中的 transpose
函数会自动进行此类转换。
如何将列表列表转换为 DataFrame,其中第一个 "layer" 列表应该是行?
myList = list(
list(name="name1",num=20,dogs=list("dog1")),
list(name="name2",num=13,dogs = list()),
list(name="name3",num=5,dogs=list("dog2","dog4"))
)
我的第一个想法是取消列出 "third layer"
中的元素myUnList = sapply(myList,function(x){y=x;y$dogs = unlist(y$dogs);y})
我可以创建一个 tibble
tibble(myUnList)
# A tibble: 3 x 1
myUnList
<list>
1 <list [3]>
2 <list [2]>
3 <list [3]>
请注意,如果我用 myList[[1]]
来表示 name
的向量,那会很简单,但我在如何整理以其他方式呈现的数据方面遇到了麻烦。我虽然关于使用 purrr
到 "invert" 订单。
预期结果:
# A tibble: 3 x 3
names num dogs
<list> <list> <list>
1 <chr [1]> <dbl [1]> <list [1]>
2 <chr [1]> <dbl [1]> <list [0]>
3 <chr [1]> <dbl [1]> <list [2]>
是否有其他类型的数据结构支持可变长度条目?
我们可以使用 purrr
包中的 map
函数提取列表元素,然后使用 data_frame
创建一个新的 tibble。
图书馆(tidyverse)
dat <- data_frame(name = map_chr(myList, "name"),
num = map_dbl(myList, "num"),
dogs = map(myList, "dogs"))
dat
# # A tibble: 3 x 3
# name num dogs
# <chr> <dbl> <list>
# 1 name1 20.0 <list [1]>
# 2 name2 13.0 <NULL>
# 3 name3 5.00 <list [2]>
如果您希望所有内容都在列表列中,请将 map_chr
和 map_dbl
替换为 map
。
dat <- data_frame(name = map(myList, "name"),
num = map(myList, "num"),
dogs = map(myList, "dogs"))
dat
# name num dogs
# <list> <list> <list>
# 1 <chr [1]> <dbl [1]> <list [1]>
# 2 <chr [1]> <dbl [1]> <NULL>
# 3 <chr [1]> <dbl [1]> <list [2]>
在尝试 purrr
一段时间后,我找到了另一个不需要输入名称的解决方案(对于非常大的列表可能会很麻烦)。
myList %>% transpose %>% simplify_all %>% tbl_df
结果
# A tibble: 3 x 3
name num dogs
<chr> <dbl> <list>
1 name1 20 <list [1]>
2 name2 13 <list [0]>
3 name3 5 <list [2]>
purrr
中的 transpose
函数会自动进行此类转换。