我想堆叠一个data.frames列表,但有时列有不同的数据类型.我希望操作能够强制降低最低标准(通常character在我的情况下).
这种堆叠发生在一个包含几乎任何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)
Run Code Online (Sandbox Code Playgroud)
我希望输出是一个带有单个字符向量的data.frame:
x
1 1
2 2
3 3
4 4
5 5
6 6
7 z1
8 z2
Run Code Online (Sandbox Code Playgroud)
我有一些长期计划使用来自(REDCap)数据库的元数据来影响强制,但我希望有一个短期的一般解决方案来进行堆叠操作.
我们可以使用rbindlist从data.table
library(data.table)
rbindlist(list(ds_a, ds_b))
# x
#1: 1
#2: 2
#3: 3
#4: 4
#5: 5
#6: 6
#7: z1
#8: z2
Run Code Online (Sandbox Code Playgroud)