绑定具有不同列类型的列表中的数据帧

时间:2018-02-13 04:44:58

标签: r dplyr purrr

尝试在purrr中找出一种方法,将列绑定在列类型不一致的列表的不同元素上。例如,我的数据看起来有点像......

d0 <- list(
  data_frame(x1 = c(1, 2), x2 = c("a", "b")),
  data_frame(x1 = c("P1"), x2 = c("c"))
)

d0
# [[1]]
# # A tibble: 2 x 2
#      x1    x2
#   <dbl> <chr>
# 1     1     a
# 2     2     b
# 
# [[2]]
# # A tibble: 1 x 2
#      x1    x2
#   <chr> <chr>
# 1    P1     c

我可以使用for循环,然后使用map_dfbind_rows来获取我想要的输出(如果列的类型不同,map_df将不起作用)。 ..

for(i in 1:length(d0)){
  d0[[i]] <- mutate_if(d0[[i]], is.numeric, as.character)
}

map_df(d0, bind_rows)
# # A tibble: 3 x 2
#      x1    x2
#   <chr> <chr>
# 1     1     a
# 2     2     b
# 3    P1     c

但我认为我错过了某个允许我避开for循环的技巧。我沿着这些方向尝试......

d0 %>%
  map(mutate_if(., is.numeric, as.character)) %>%
  map_df(.,bind_rows)
# Error in UseMethod("tbl_vars") : 
#   no applicable method for 'tbl_vars' applied to an object of class "list"

......似乎没有用(仍然让我的头脑绕过purrr)

4 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用rbindlist()中的data.table

data.table::rbindlist(d0) %>%
  dplyr::as_data_frame()
# A tibble: 3 x 2
  x1    x2   
  <chr> <chr>
1 1     a    
2 2     b    
3 P1    c

在某些情况下,您可能需要确保fill参数为TRUE

文档参考:

  

如果输入项目的列i不是全部具有相同的类型;例如,a   data.table可以与列表绑定,或列是因子而其他   是字符类型,它们被强制为最高类型(SEXPTYPE)。

答案 1 :(得分:0)

这个怎么样?

library(purrr)
map_df(lapply(d0, function(x) data.frame(lapply(x, as.character))), bind_rows)

输出是:

  x1 x2
1  1  a
2  2  b
3 P1  c

示例数据:

d0 <- list(structure(list(x1 = c(1, 2), x2 = c("a", "b")), .Names = c("x1", 
"x2"), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"
)), structure(list(x1 = "P1", x2 = "c"), .Names = c("x1", "x2"
), row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame"
)))

答案 2 :(得分:0)

使用tidyverse,选项为

library(tidyverse)    
d0 %>%
     map_df(~ .x %>% 
              mutate_if(is.numeric, as.character))
# A tibble: 3 x 2
#  x1    x2   
#  <chr> <chr>
#1 1     a    
#2 2     b    
#3 P1    c    

答案 3 :(得分:0)

这是使用purrr::modify_depth的好机会:

library(purrr)
library(dplyr)
bind_rows(modify_depth(d0,2,as.character))

# # A tibble: 3 x 2
#      x1    x2
#   <chr> <chr>
# 1     1     a
# 2     2     b
# 3    P1     c