将列表嵌套行转换为单个的数据框或tibble行 (R)

5
我有一个嵌套的列表:
data = list(a = list(1, 2, 3), b = list("foo"), c = list("toast", "onions"))

我该如何将此转换为数据框或tibble的单行?我希望具有多个元素(这里是a和c)的列表保留为列表,而单元素(b)则是常规值。
预期输出为:
# A tibble: 1 x 3
  a          b     c         
  <list>     <chr> <list>    
1 <list [3]> foo   <list [2]>

1
tibble::enframe(data) %>% tidyr::pivot_wider() - Ronak Shah
是的,Ronak,这对我有用。感谢您的帮助。那么将B列转换为常规字符列的最佳方法是什么?我尝试过 ... %>% mutate(b = map(b, unlist)),但这并不会改变实际的列类型。 - D Greenwood
[Ronak] + %>% tidyr::unnest(b) %>% tidyr::unnest(b)[罗纳克] + %>% tidyr::unnest(b) %>% tidyr::unnest(b) - Edo
谢谢Ronak。如果我将map更改为map_chr,即`... %>% mutate(b = map_chr(b, unlist))'也可以工作。 - D Greenwood
4个回答

2

这个怎么样?

> as_tibble_row(Map(function(x) ifelse(length(x)==1,unlist(x),list(x)),data))
# A tibble: 1 x 3
  a          b     c
  <list>     <chr> <list>
1 <list [3]> foo   <list [2]>

1
data[] <- lapply(data, function(x) if (length(x) == 1) x[[1]] else list(x))
data.table::setDF(data)

# > str(data)
# 'data.frame': 1 obs. of  3 variables:
#  $ a:List of 1
#   ..$ :List of 3
#   .. ..$ : num 1
#   .. ..$ : num 2
#   .. ..$ : num 3
#  $ b: chr "foo"
#  $ c:List of 1
#   ..$ :List of 2
#   .. ..$ : chr "toast"
#   .. ..$ : chr "onions"

1
您可以使用enframe+pivot_wider
tibble::enframe(data) %>% tidyr::pivot_wider() 
#      a          b          c         
#  <list>     <list>     <list>    
#1 <list [3]> <list [1]> <list [2]>

获取长度为一的列作为向量,我们可以添加:

library(dplyr)

tibble::enframe(data) %>% 
  tidyr::pivot_wider() %>%
  summarise(across(.fns = ~if(length(unlist(.)) == 1) unlist(.) else .))

#      a          b     c         
#  <list>     <chr> <list>    
#1 <list [3]> foo   <list [2]>

0
一个选择是使用来自基础R的aggregate创建一个具有两列数据集。
aggregate(values ~ ind, stack(data), list)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接