我有一个数据库A
。我想将其与数据库B
(具有数百个变量)中的一些变量合并。 B
中的所有变量都有标签。所以,如果我这样做:
use A.dta
merge 1:1 id using B.dta, keepusing(var1 var2)
我从复制到B
的{{1}}中获得了所有值标签。
如果我改为:
A
merge 1:1 id using B.dta, keepusing(var1 var2) nolabel
和var1
在var2
中没有标签。
在A
中似乎没有选项允许在两者之间提供解决方案(即仅复制合并值的值标签)。
一种解决方法是运行:
merge
第一种方法之后。但是,每次合并完成后都需要运行此操作(并且我进行了很多次合并)。它也可能非常慢(数据集labelbook, problems
label drop `r(notused)'
有很多变量)。
另一个选择是创建一个仅包含我想要的变量和值标签的临时数据集“ B-minus”,然后从中合并。但这还需要运行与上面相同的耗时代码,因此没有什么不同。
是否有“更好”的方法来实现这一目标?
MCVE:
B
答案 0 :(得分:1)
merge
中没有这样的选项,但是您可以简单地使用macro list manipulation:
webuse voter, clear
label list // shows two variables with value labels (candidat and inc)
drop candidat inc
label drop candidat inc2 // we drop all value labels
local labkeep candidat // define which labels you want to keep
merge 1:1 pop frac using http://www.stata-press.com/data/r14/voter, nogen keepusing(candidat)
quietly label dir
local secondary "`r(names)'"
display "`secondary'"
local newlabels : list secondary - labkeep
display "`newlabels'"
label drop `newlabels'
label list
答案 1 :(得分:0)
更新:不使用保留/恢复(感谢@Pearly Spencer突出显示此内容)进一步提高了该方法的速度。要查看具有保留/恢复功能的旧代码,请参见the older versions of this answer。
我认为我找到了解决问题的更快方法(至少从使用timer on
,timer off
的结果来看)。
因此,回顾一下,当前缓慢的方法是合并数据库,然后使用删除所有未使用的标签
labelbook, problems
label drop `r(notused)'
另一种更快的方法是仅使用所需的变量加载较小的数据集。这将仅包含所选变量的标签。然后,将该较小的数据库与原始数据库合并。重要的是,合并方向相反!这样,就消除了保存/恢复的需要,正如@Pearly Spencer所建议的那样,这样做可以放慢速度,特别是在较大的数据集中。
就我的原始示例而言,代码为:
*** Open and work with dataset A ***
use A.dta // load original dataset
... // do stuff with it (added just for generality)
save A_final.dta // name of final dataset
*** Load dataset B with subset of needed variables only ***
use id var1 var2 using B.dta, clear // this loads id (needed for merging), var1 and var2 and their labels only!
*** Merge modified A dataset into smaller B dataset ***
merge 1:1 id using A_final.dta, keep(using match) // we do not specify any variables to load, as all those in A_final.dta needed) IMPORTANT: if we want to keep all observations of the original dataset (A, which is the one being merged into B), we need to use "using" rather than "master" in the "keep()" option.
save A_final.dta, replace // Create final version of A. Done!
就是这样!我不确定这是否是最佳解决方案,但就我而言,如果要合并许多具有数百个变量的数据集,速度会更快。
关于MCVE的代码为:
*** Open original dataset and work with it ***
webuse voter, clear
label list // shows two variables with value labels (candidat and inc)
drop candidat inc
label drop candidat inc2 // we drop all value labels
save final.dta
*** Create temporary dataset ***
use pop frac candidat using http://www.stata-press.com/data/r14/voter, clear // this is key. Only load needed variables!
*** Merge temporary dataset with original one ***
merge 1:1 pop frac using final.dta, nogen
label list // we only have the "candidat" label! Success!
save final.dta, replace