【发布时间】:2026-01-12 03:45:01
【问题描述】:
我想要egen newvar = anymatch(oldvar1), values(oldvar2) 之类的东西。这将创建一个指示变量,显示 oldvar2 中的特定值是否包含在 oldvar1 的任何位置。除了 anymatch 的 AFAIK,values 仅接受 integer numlist。
这会有很多用途,但这是我的第一个示例:我有一个大型国家/地区对数据集。我有一个具有特定属性的 Country1 子集。我想识别与子集的任何成员匹配的 Country2。
让我们看看我是否可以制作一个玩具示例:
+--------------------------------------------------+
| pair Country1 value_C1 Country2 valC1_g2 |
|--------------------------------------------------|
1. | AB A 1 B 0 |
2. | AC A 2 C 0 |
3. | BA B 3 A 1 |
4. | BC B 4 C 1 |
5. | CA C 5 A 1 |
|--------------------------------------------------|
6. | CB C 6 B 1 |
+--------------------------------------------------+
value_C1 变量与 Country1 的属性相关。变量 valC1_g2 表示 value_C1 > 2。我想要一个变量来指示 Country2 中的每个特定变量是否在 Country1 if valC1_g2 列表中的某处匹配。
这似乎不是一个罕见的问题,但除了这个 researchgate 主题之外,我找不到任何直接解决它的东西。
这可以通过合并来完成:
preserve // saves current data
tempfile localdata // initialize a temporary new dataset
keep Country1 valC1_g2 // subsetting allows re-ordering of just these variables
rename (Country1 valC1_g2) (Country2 valC2_g2) // renaming to match the target
sort Country2 // this just facilitates the 1:1 merge
save `localdata'
restore // bring back original data
sort Country2
merge Country2 using `localdata' // this re-orders the subset to align with Country2
sort Country1 pair // this resets the dataset to the original order
list, abbreviate(10) separator(0)
+-------------------------------------------------------------+
| pair value_C1 Country1 Country2 valC1_g2 valC2_g2 |
|-------------------------------------------------------------|
1. | AB 1 A B 0 1 |
2. | AC 2 A C 0 1 |
3. | BA 3 B A 1 0 |
4. | BC 4 B C 1 1 |
5. | CA 5 C A 1 0 |
6. | CB 6 C B 1 1 |
+-------------------------------------------------------------+
我发现这种方法存在一些问题。
首先,您会看到我的 merge 语法使用旧语法,因为 Country2 不能唯一标识我的数据。 (我想这意味着我在新语法中使用 m:m 吗?merge 的文档说这是不行的。)pair 变量扮演这个角色,但我不能成对合并,否则我不会得到我需要的重新排序。可能是我担心太多了?
其次,我如何检查它是否有效?之后我想比较 Country1 和 Country2 中的国家 ID,看看它们是否具有相同的值集。 compare 不起作用,因为这些值没有按行排列。我唯一能想到的就是在再次使用合并重新排序后进行比较,但这实际上只是撤消了我刚刚所做的事情。
如果有任何更好的方法建议,我将不胜感激。
【问题讨论】: