逐步left_join/merge
Posted
技术标签:
【中文标题】逐步left_join/merge【英文标题】:Stepwise left_join/merge 【发布时间】:2019-02-04 13:32:37 【问题描述】:我有一个 250k 观察值的主 df,我想向其中添加一组变量,由于 left_join/merge 函数的限制,我必须以较小的 dfs(每个 50k 观察值的 5 个不同 dfs)计算这些变量行大小(2^31-1 个观察值)。
我现在尝试在主 df 和 5 个较小的 df 上使用 left_join 或 merge-functions 将新变量的列添加到主 df,以便在每个步骤中进行 50k 次观察。
mainFrame <- left_join(mainFrame, newVariablesFirstSubsample)
mainFrame <- left_join(mainFrame, newVariablesSecondSubsample)
mainFrame <- left_join(mainFrame, newVariablesThirdSubsample)
mainFrame <- left_join(mainFrame, newVariablesFourthSubsample)
mainFrame <- left_join(mainFrame, newVariablesFifthSubsample)
在第一个 left_join(包括前 50k 个观察值的新变量值)之后,当我运行第二个到第五个 left_joins 时,R 似乎不包含以下 50k 个观察值组的任何值。我通过在每个 left_join 之后为各个列构建汇总统计数据得出这个结论。
知道我做错了什么或可能使用哪些其他功能吗?
【问题讨论】:
您好,您是否尝试过使用data.table
?我不记得有 2^31-1 观察的限制
我没有 - 使用 data.table 将如何工作?
与merge
: merge(dt1, dt2, by.x=c("X","Y"), by.x=c("Z","K"), all.x=T, all,y=F)
的左连接相同。你可以先把你的数据框变成数据表:mainFrame <- as.data.table(mainFrame)
它只是给了我错误:as.vector(x, mode) 中的错误:无法将“内置”类型强制转换为“任何”类型的向量
如果每次加入后行数都在增加,这意味着你加入的任何列都不是唯一的——这可能很糟糕。
【参考方案1】:
数据表允许您创建“键”,它们是 R 版本的 SQL 索引。这将帮助您加快搜索 R 用于合并或左连接的列。
如果我是你,我会将它们全部导出到 csv 文件中,然后通过 SQL 或使用 SSIS 服务来计算它们。
我注意到的问题是您从汇总统计数据中意识到了错误。您是否尝试过颠倒插入表格的顺序。或者明确说明左连接中使用的列的名称?
请告诉我们结果。
【讨论】:
我按照你的建议恢复了插入表格的顺序,结果真的让我更加困惑:我首先离开了最后一个子样本,它的作用是给我同样的错误当我加入整个样本时给我:left_join_impl(x, y, by_x, by_y, aux_x, aux_y, na_matches) 中的错误:std::bad_alloc。这意味着,错误不是源于样本太大,我回到“开始”。 尝试查看两个数据框中的列名(它们匹配吗?)。我对在R中使用left_join不太感兴趣,尝试使用合并并将相应的值分配给by.x = nameColumnLeftTable和by.y = nameColumnRightTable 它们具有完全相同的名称、长度和类别。当我使用合并时,它给了我以下错误:merge.data.frame() 中的错误:不允许负长度向量。以上是关于逐步left_join/merge的主要内容,如果未能解决你的问题,请参考以下文章