合并列名相同但顺序不同的数据框得空结果,求解决方法
问题分析与解决方案
先帮你拆解下遇到的问题,再给出针对性的解决办法:
1. merge 参数写错了
你用的all.data1=TRUE是无效参数——merge()函数里控制保留某一侧所有行的参数是all.x(对应第一个输入数据集)和all.y(对应第二个输入数据集),这个参数错误会让函数默认只保留两个数据集共同列取值完全匹配的行,如果没有匹配的行,自然就得到空数据框了。
2. 可能混淆了「匹配合并」和「行绑定」的需求
如果你的目标是把两个数据集上下拼接(同名列自动对齐,不同列保留并用NA填充),而不是按共同列做关联匹配,那merge()根本不是合适的工具,应该用行绑定类的函数。
方案一:修正merge参数,实现匹配合并(保留data1所有行)
先把参数改对,再验证共同列是否有匹配值:
data1 <- read.csv2("Data2 kopio 2.csv", stringsAsFactors = FALSE) data2 <- read.csv2("Data3.csv", stringsAsFactors = FALSE) common_column_names <- intersect(names(data1), names(data2)) # 修正参数为all.x=TRUE,确保保留data1的所有行 data3 <- merge(data1, data2, by=common_column_names, all.x=TRUE) # 先检查共同列有没有匹配的取值,比如取第一个共同列验证交集情况 sample_common_col <- common_column_names[1] sum(data1[[sample_common_col]] %in% data2[[sample_common_col]])
如果上面的求和结果是0,说明两个数据集的共同列里完全没有匹配的取值,这时候即使参数正确,也会得到和data1行数一致的结果,但data2的列会全是NA;如果还是0观测,那可能是共同列的类型不一致(比如一个是字符,一个是数值/因子),可以用str(data1[, common_column_names])和str(data2[, common_column_names])检查类型是否统一。
方案二:行绑定(上下拼接数据集,同名列自动合并)
如果你的需求是把两个数据集直接叠在一起,不管匹配关系,只对齐同名列,推荐用dplyr包的bind_rows()函数,操作更简单直观:
# 先安装并加载dplyr(如果没安装的话) # install.packages("dplyr") library(dplyr) data1 <- read.csv2("Data2 kopio 2.csv", stringsAsFactors = FALSE) data2 <- read.csv2("Data3.csv", stringsAsFactors = FALSE) # 自动对齐同名列,不同列保留,缺失值用NA填充 data3 <- bind_rows(data1, data2)
这个方法会直接把两个数据集的行合并,同名列自动合并成一列,某个数据集没有的列会用NA填充,完全符合你说的「同名列的合并」需求。
内容的提问来源于stack exchange,提问作者roosa dahal
相关产品推荐
相关产品推荐

