根据行中的值连接ID [英] Connect IDs based on values in rows
本文介绍了根据行中的值连接ID的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我计划进行网络分析,我需要以一种可以使用社区贡献的命令nwcommands
的方式组织我的数据。
以下是数据示例:
* Example generated by -dataex-. To install: ssc install dataex
clear
input str11 idb long(idd1 idd2 idd3)
"62014" 370490 879271 1112878
"62015" 457013 1112878 370490
"62016" 341863 1366174 533773
"62017" 879271 327069 341596
"62018" 1391443 1366174 879271
end
最终,当一个idb
连接到另一个idb
时,我希望矩阵的值为1
,如果不是,则0
。只要两个idb
至少共享一个idd
(不必在同一idd
列中),就存在连接。
示例输出:
62014 62015 62016 62017 62018
62014 1 1 0 1 1
62015 1 1 0 0 0
62016 0 0 1 0 1
62017 1 0 0 1 1
62018 1 0 1 1 1
如何在Stata中执行此操作?
推荐答案
以下是使用Stata的矩阵编程语言mata
完成此操作的一种方法:
/* Prepare data */
putmata A = (idd*), replace
/* Define mata functions */
mata:
function foo2(b, c)
{
res = 0
for (i = 1; i <= cols(b); i++) {
for (j = 1; j <= cols(c); j++) {
if (b[i] == c[j]) res = 1
}
}
return(res)
}
function foo1(a)
{
M = J(rows(a), rows(a), 0)
for (i = 1; i <= rows(a); i++) {
for (j = 1; j <= rows(a); j++) {
k = foo2(a[i,.], a[j,.])
if (k == 1) M[i, j] = 1
}
}
return(M)
}
end
/* Execute and get results */
mata: B = foo1(A)
getmata (idb*) = B
list
+------------------------------------------------------------------------+
| idb idd1 idd2 idd3 idb1 idb2 idb3 idb4 idb5 |
|------------------------------------------------------------------------|
1. | 62014 370490 879271 1112878 1 1 0 1 1 |
2. | 62015 457013 1112878 370490 1 1 0 0 0 |
3. | 62016 341863 1366174 533773 0 0 1 0 1 |
4. | 62017 879271 327069 341596 1 0 0 1 1 |
5. | 62018 1391443 1366174 879271 1 0 1 1 1 |
+------------------------------------------------------------------------+
这篇关于根据行中的值连接ID的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文