问题描述
我有两个数据框(让我们分配 df1
和 df2
),它们每个都有 1347 列(并且两个数据框的列名完全相同)和不同的行数({{1} 中的 730 }} 和 df1
中的 706)。
我需要计算所有列之间的差异(除了一列,即 1346 列之间的差异)并保存列的名称。我知道的最好方法是在 df2
包中使用 full outer join
连接编写 sql 语句,因为我需要完整范围的对象。
这是一个小例子:
sqldf
但是 sqldf("select a.regn,a.col1 - b.col1 as col1,a.col2 - b.col2 as col2 ...
from df1 a full outer join df2 b on a.regn = b.regn")
不提供 sqldf
。
当列数相当高时,我就在循环中编写了我的 sql 语句。
我怎样才能避免这个问题?
解决方法
您可以组合两个在 left outer joins
后端工作的 SQLite
:
sqldf("select a.regn,a.col1 - b.col1 as col1,a.col2 - b.col2 as col2 ...
from df1 a left outer join df2 b on a.regn = b.regn UNION
select a.regn,a.col2 - b.col2 as col2 ...
from df2 a left outer join df1 b on a.regn = b.regn
")
如果您在 df1
或 df2
中没有重复的行,此方法有效,因为 UNION
会删除重复的行。