【问题标题】:Connect IDs based on values in rows根据行中的值连接 ID
【发布时间】:2019-10-09 11:50:51
【问题描述】:

我正计划进行网络分析,我需要以我可以使用 community-contributed 命令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 连接到另一个idb0 时,我希望有一个值为1 的矩阵。只要两个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


    【解决方案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 |
         +------------------------------------------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多