无关联键时合并不同大小R DataFrame的优雅方法
无关联键时按行合并不同行数DataFrame的优雅方案
我有两个列结构和行数均不同的R语言DataFrame:
library(tidyverse) tb1 <- tibble(a= 1:10, b=11:20) tb2 <- tibble(q= 1:5, z= 11:15)
如果存在id列作为关联键,可通过full_join轻松合并;但现在无关联键,且不想预先在每个DataFrame中创建行号列,请问是否有比以下方法更优雅的合并方案?
tb1 %>% mutate(row = row_number()) %>% left_join( tb2 %>% mutate(row = row_number()), by = "row" ) %>% select(-row)
几种更简洁的实现方式
1. 用rowid_to_column简化行号生成
tibble包提供的rowid_to_column函数可以直接为DataFrame添加行号列,比手动调用mutate(row = row_number())更简洁,且不会产生额外的中间变量:
tb1 %>% rowid_to_column("row") %>% left_join(tb2 %>% rowid_to_column("row"), by = "row") %>% select(-row)
2. 紧凑式left_join写法
把行号生成逻辑直接嵌入left_join的参数中,省去管道的中间步骤,让代码结构更紧凑:
left_join( mutate(tb1, row = row_number()), mutate(tb2, row = row_number()), by = "row" ) %>% select(-row)
3. 补全行数后直接列绑定
如果想避免使用join操作,可以先将行数较少的DataFrame补全NA值至与另一DataFrame行数一致,再用bind_cols直接合并:
tb2 %>% add_row(!!!map(., ~rep(NA, nrow(tb1) - nrow(.)))) %>% bind_cols(tb1, .)
这里通过map为tb2的每一列生成对应数量的NA值,再用add_row补全行数,最后直接列合并,效果与join方式完全一致。
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

