尝试在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_df
和bind_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)
答案 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