如何通用合并同列名tibbles并自动类型提升?附Base R方案
解决方案:使用Base R的
rbind() 编辑补充: 直接使用Base R中的rbind即可!
问题背景
我拥有一组列名与列顺序相同,但列类型可能不兼容的tibbles列表,希望像tibble::add_row()那样将这些表纵向拼接为一个表,必要时自动将类型转换为最通用的类型(例如c(1, 2, "a")会返回c("1", "2", "a"))。我无法提前知晓列的类型。
示例输入
> X = tibble(a = 1:3, b = c("a", "b", "c")) # A tibble: 3 × 2 a b <int> <chr> 1 1 a 2 2 b 3 3 c > Y = tibble(a = "Any", b = 1) # A tibble: 1 × 2 a b <chr> <dbl> 1 Any 1
期望输出
# A tibble: 4 × 2 a b <chr> <chr> 1 1 a 2 2 b 3 3 c 4 Any 1
通用实现方式
使用Base R的rbind()函数即可满足需求:
rbind(X, Y)
执行后会自动将列类型提升为最通用的类型,完全遵循c(...)的类型优先级(NULL < raw < logical < integer < double < complex < character < list < expression)。
针对因子类型的处理
如果遇到因子列,rbind()会自动将其转换为字符类型,保留因子的标签而非底层的整数索引,符合需求。例如:
X_factor <- tibble(a = 1:3, b = factor(c("a", "b", "c"))) Y_num <- tibble(a = "Any", b = 1) rbind(X_factor, Y_num)
输出结果中b列会是字符类型,保留了因子的标签"a"、"b"、"c",而非对应的整数编码。
对data frame和tibble的兼容性
rbind()对普通data frame和tibble均适用,不会在二者之间进行强制转换,完全符合编写中立包的要求。
内容的提问来源于stack exchange,提问作者Jollywatt
相关产品推荐
相关产品推荐

