将元素为空、名称重复、结构不一致的嵌套列表绑定到一个tibble中/ R

dwthyt8l  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(99)

我有一个很大的嵌套列表,它包含其他列表,这些列表包含tibbles。在清理元素后,我留下了很多空的tibbles和列表。
现在我想把我的结果放到一个单独的Dataframe中,但是我收到错误消息:

Argument x must have names.

我知道空元素会搞砸我绑定行的尝试,但我找不到删除所有空tibble的方法。
这是我的数据结构:

a<-tibble (1:7,
        letters[7:1])

b<-tibble (1:7)

c<-tibble(.rows=2)



riddle<-list(list(a,b,c), list(list(a,b,c)), list(c),c)

bind_rows(riddle)

请注意,这只是一个最小化的版本。所以任何手动编辑或删除元素不会对我的原始数据工作。
任何有咕噜声的解决方案都会特别有用!:)
提前感谢您的帮助!!
编辑:
@akrun的答案解决了上面的问题,但我发现我的数据的主要问题是同名变量的结构,一个通用类型的字符应该可以工作。
我在一个稍有改动的例子中重现了这个错误:
一个二个一个一个
谢谢你的建议
编辑:
另一个必要的步骤是实现make.unique (),因为我的原始数据包含重复的列名,这不能与row.bind合并,下面的@akrun对此进行了解释和回答。

mw3dktmi

mw3dktmi1#

如果我们想要获得单个数据集,请使用map循环list,然后使用bind_rows

library(purrr)
library(dplyr)
map_dfr(riddle, bind_rows)

如果要移除0行或0列的数据集,请使用递归函数检查alldim属性的值是否大于0

library(rrapply)
riddle2 <- rrapply(riddle, condition = function(x) all(dim(x)>0), 
     classes = "data.frame", how= "prune")
  • 比较结构
    一个二个一个一个
    对于不同类型的更新版本,可以转换为单一类型,绑定后再使用type.convert
rrapply(riddle, condition = function(x) all(dim(x)>0),
  f =  function(x) x %>% 
  mutate(across(everything(), as.character)),
     classes = "data.frame", how= "flatten") %>%
  bind_rows %>%
  type.convert(as.is = TRUE)
  • 输出
# A tibble: 35 × 3
       a b     c    
   <int> <chr> <chr>
 1     0 g     0    
 2     0 f     0    
 3     0 e     0    
 4     0 d     0    
 5     0 c     0    
 6     0 b     0    
 7     0 a     0    
 8     0 8     g    
 9     0 8     f    
10     0 8     e    
# … with 25 more rows

如果有重复的列名,我们可以使用make.unique使其唯一,因为data.frame需要唯一的列名。

rrapply(riddle, condition = function(x) all(dim(x)>0),  
    f =  function(x) 
      {
     # change to unique column names
     names(x) <- make.unique(names(x))
   x %>%  
        # convert all columns to character if there
        # are mismatch in column types in any list elements
        mutate(across(everything(), as.character))
     },      classes = "data.frame", how= "flatten") %>% 
     # bind the flattened list of data.frame/tibbles to single dataset
    bind_rows %>%
     # do the column type conversion 
     type.convert(as.is = TRUE)

相关问题