根据行中的值连接ID

时间:2019-10-09 11:50:51

标签: stata

我打算进行网络分析,我需要以一种可以使用社区贡献命令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

最终,当一个1连接到另一个idb时,我想有一个值为idb的矩阵,如果没有连接,则为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中做到这一点?

1 个答案:

答案 0 :(得分:1)

这是使用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 |
     +------------------------------------------------------------------------+