在R语言中以行索引为键实现数据框的外连接
解决方案
要实现以行索引为键的外连接,有两种常用方法,同时可将合并后的缺失值替换为你期望的-:
方法1:直接通过merge函数的行索引参数合并
merge函数支持通过指定by.x=0和by.y=0来以两个数据框的行索引作为连接键,搭配all=TRUE实现外连接:
# 执行外连接 merged_df <- merge(df1, df2, by.x = 0, by.y = 0, all = TRUE) # 将临时生成的行名列设为数据框行名,并删除该列 row.names(merged_df) <- merged_df$Row.names merged_df <- merged_df[, -1] # 将NA替换为"-" merged_df[is.na(merged_df)] <- "-"
执行后得到的结果与你期望的一致:
01.2020 02.2020 03.2020 08.2020 04.2020 09.2020 11190 4 1 2 1 2 2 12345 3 3 1 1 2 3 11323 1 2 2 - - - 11324 - - - 1 2 2
方法2:先将行索引转为普通列再合并
先把两个数据框的行索引提取为新列(比如命名为ID),再基于该列执行外连接:
# 为df1和df2添加行索引列 df1$ID <- row.names(df1) df2$ID <- row.names(df2) # 执行外连接 merged_df <- merge(df1, df2, by = "ID", all = TRUE) # 将ID列设为行名,并删除ID列 row.names(merged_df) <- merged_df$ID merged_df <- merged_df[, !names(merged_df) %in% "ID"] # 替换NA为"-" merged_df[is.na(merged_df)] <- "-"
关于merge函数的by参数说明
你原代码中by = ""的写法是错误的,by参数需要指定具体的连接列名。如果要直接用行索引作为键,不能设置为空字符串,而是用by.x=0和by.y=0(0代表行索引),或者先将行索引转为列后指定对应的列名(如上述方法中的ID)。
内容的提问来源于stack exchange,提问作者Bella_18
相关产品推荐
相关产品推荐

