【问题标题】:Copy values from one observation to another based on unique identifier根据唯一标识符将值从一个观察值复制到另一个观察值
【发布时间】:2021-04-08 10:16:49
【问题描述】:

我有一个包含许多变量的数据集。对于许多观察值,我想用基于唯一标识符的另一个观察值(对于相同变量)替换它们的值(在大量变量中)。唯一标识符不等于 Stata 观察编号 (_n)。

这类似于其他几个线程,但据我所知,它们的解决方案不是完全可移植的

  1. transfer values from one variable to another in Stata但我没有简单的词法关系 我可以使用
  2. https://www.stata.com/statalist/archive/2013-06/msg00056.html 但我不能依赖 Stata 的观察数字,因为数据集是动态的,观察的顺序和数量可能会发生变化。

这是基于第二个链接的解决方案的一段代码,但已针对我的问题进行了调整(我更改了最后一个宏中方括号的内容)。我知道这段代码不起作用,因为这里的方括号只能包含一个 Stata obs 编号 (_n)。但我认为这应该很好地说明我正在努力实现的目标:

在此示例中,我想将 unique_id 为 25 和 38 的观察值替换为 unique_id 为 21 的观察值。这应该对我本地 varlist 中的所有变量进行。

set obs 50

local vlist v1 v2 v3 v4 v5

foreach v of local vlist { 
    generate `v' = runiform()
}

gen unique_id=_n+20  // this is just to illustrate that the unique_id is not equal to _n


foreach var of local vlist {
replace `var' =`var'[unique_id==21] if unique_id==25 | unique_id==38
}

【问题讨论】:

  • 该语法是合法的,但不是您通常想要的。 unique_id == 21 如果为真,则为 1,如果为假,则为 0。当且仅当数据之前已对数据进行排序以使 unique_id 在第一次观察中为 21 时,对 varname[1] 的引用才是您想要的,因此下标是正确的。否则,Stata 在这方面不是 R!使用的语法不是选择标量的方法

标签: replace stata stata-macros


【解决方案1】:

这是一种方法:

foreach var of local vlist {
    su `var' if unique_id == 21, meanonly 
    replace `var' = r(mean) if unique_id==25 | unique_id==38
}

这是另一种方法:

gen reference = unique_id == 21 
sort reference 

foreach var of local vlist {
    replace `var' = `var'[_N] if unique_id==25 | unique_id==38
}

当然,如果您查看数据并计算出此刻标识符 21 在观察 42 中,例如,然后将其用作下标,这是一个直接的答案,但不是好的或稳健的风格。

另请参阅this paper,了解该领域的一些技术。

如果有人认为 Stata 风格在这个问题上看起来很尴尬,我会表示同情。此外,这种问题似乎非常临时,但这样的问题也是真实的。

【讨论】:

  • 非常感谢,尼克!您的第二个解决方案就像一个魅力!您的第一个解决方案给了我一个类型不匹配错误 - 我还没有弄清楚为什么(我的实际唯一标识符变量是一个数字浮点变量,就像上面的示例一样,据我了解,它不应该有所作为,什么数据类型vlist v1-v5 中的变量是?)。可能您需要有关我的数据的更多信息来回答这个问题,但是由于第二种选择有效,我将其保留在此。此外,该论文似乎非常有用,对于一些经常处理面板数据的同事来说也是如此。再次感谢!
  • 您的问题代码 创建 v1v5 为数字。但是,如果您的任何实际变量是字符串,summarize 不会出错,但平均值会作为缺失值返回,并且您不能 replace 系统缺失它的任何值,这是一个数值。因此,第一个解决方案的代码取决于您的问题代码,而第二个解决方案更通用。很高兴它有帮助。
  • "returned as missing" 不太对。但是在字符串变量的summarize 之后,如果您尝试使用r(mean),它将被评估为缺少任何方式的数字系统。
猜你喜欢
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
相关资源
最近更新 更多