R语言合并Data Frame遇内存分配错误及行数异常问题求助
问题原因与解决方法
问题根源
你用left_join时出现行数超预期和内存错误,核心原因是df2中同一ID存在多条重复记录,导致左连接产生了笛卡尔积:
- df1里ID=1有4条,df2里ID=1也有4条,连接后会生成4×4=16条ID=1的记录;同理ID=2会生成16条,最终总记录数远超过df1的8条。如果数据量更大,这种笛卡尔积会直接耗尽内存,触发
cannot allocate vector错误。
解决方法
因为df2中同一ID对应的CD值完全一致,我们只需要保留每个ID对应的唯一CD记录,再做连接即可;或者直接用匹配方法赋值,彻底避免笛卡尔积。
方法1:先去重df2再做左连接(dplyr)
library(dplyr) # 提取每个ID对应的唯一CD记录 df2_unique <- df2 |> distinct(ID, CD) # 执行左连接,此时每个df1的行只会匹配1条记录 df3 <- df1 |> left_join(df2_unique, join_by(ID))
方法2:用match直接赋值(无需额外加载包)
# 给df1新增CD列,通过ID匹配df2的CD值 df3 <- df1 df3$CD <- df2$CD[match(df1$ID, df2$ID)] # 由于df2同一ID的CD相同,match会取第一个匹配到的值,结果完全正确
方法3:用data.table处理(适合大数据量,效率更高)
library(data.table) setDT(df1) setDT(df2) # 去重df2,保留每个ID的唯一记录 df2_unique <- unique(df2, by = "ID") # 左连接并赋值CD列 df3 <- df1[df2_unique, on = "ID", CD := i.CD]
内容的提问来源于stack exchange,提问作者Sai Paritala
相关产品推荐
相关产品推荐

