【发布时间】:2016-09-07 19:02:43
【问题描述】:
我想堆叠一个 data.frames 列表,但有时这些列具有不同的数据类型。我希望操作强制到最低公分母(在我的情况下通常是 character)。
这种堆叠发生在package function 内,该package function 接受几乎任何data.frames 列表。它实际上没有能力将ds_a$x 强制转换为bind_rows() 之前的角色。
ds_a <- data.frame(
x = 1:6,
stringsAsFactors = FALSE
)
ds_b <- data.frame(
x = c("z1", "z2"),
stringsAsFactors = FALSE
)
# These four implementations throw:
# Error: Can not automatically convert from integer to character in column "x".
ds_1 <- dplyr::bind_rows(ds_a, ds_b)
ds_2 <- dplyr::bind_rows(ds_b, ds_a)
ds_3 <- dplyr::bind_rows(list(ds_a, ds_b))
ds_4 <- dplyr::union_all(ds_a, ds_b)
我希望输出是带有单个字符向量的 data.frame:
x
1 1
2 2
3 3
4 4
5 5
6 6
7 z1
8 z2
我有一些使用 (REDCap) 数据库中的元数据来影响强制转换的长期计划,但我希望有一个短期通用解决方案用于堆叠操作。
【问题讨论】:
-
它也适用于
rbind。我假设您希望将批处理的 API 调用绑定在一起,因此它们都应该具有相同的名称。 -
在这种情况下,我通常将它们转换为因子,但我不确定如果将每一列转换为因子列然后将它们转换回来,它会在多大程度上影响速度..
-
fwiw,在 ds_a 充满整数而 ds_b 是字符的情况下,我会执行
ds_5<-bind_rows(ds_a%>%mutate_all(as.character),ds_b)之类的操作。