“平方”数据集

时间:2019-06-07 14:32:06

标签: stata

我有一组工厂(ABC)既可以充当发送者也可以充当接收者,但实际上,并不是所有人都在实际发送或接收。我需要填写缺失的连接,以使数据矩阵为“正方形”(或“二次”),而不是将其矩形化。

这是我的数据:

clear
input str1 sender str1 receiver value
 A  B   100
 A  C   200
 B  A   100
end

Stata的fillin命令几乎可以满足我的要求:

fillin sender receiver
drop if sender == receiver

list

   +-------------------------------------+
   | sender   receiver   value   _fillin |
   |-------------------------------------|
1. |      A          B     100         0 |
2. |      A          C     200         0 |
3. |      B          A     100         0 |
4. |      B          C       .         1 |
   +-------------------------------------+

下面是我期望的输出:

   +-----------------------------+
   | sender   receiver   value   |
   |-----------------------------|
1. |      A          B     100   |
2. |      A          C     200   |
3. |      B          A     100   |
4. |      B          C       .   |
5. |      C          A       .   |
6. |      C          B       .   |
   +-----------------------------+

是否有一种简单的方法?

2 个答案:

答案 0 :(得分:2)

比@Pearly Spencer的解决方案更通用。

clear
input str1 sender str1 receiver    value
A  B   100
A  C   200
B  A   100
end 

egen tag = tag(receiver) 
local N = _N 
expand 2 if tag 
replace sender = receiver if _n > `N'  
replace value = . if _n > `N' 

fillin sender receiver 
drop if sender == receiver 
list, sepby(sender) 

     +-------------------------------------------+
     | sender   receiver   value   tag   _fillin |
     |-------------------------------------------|
  1. |      A          B     100     1         0 |
  2. |      A          C     200     1         0 |
     |-------------------------------------------|
  3. |      B          A     100     1         0 |
  4. |      B          C       .     .         1 |
     |-------------------------------------------|
  5. |      C          A       .     .         1 |
  6. |      C          B       .     .         1 |
     +-------------------------------------------+

答案 1 :(得分:1)

您需要向Stata提供缺少的信息,然后应用fillin

 clear
 input str1 sender str1 receiver    value
 A  B   100
 A  C   200
 B  A   100
end

set obs 4
replace sender = "C" in 4
replace receiver = "A" in 4

fillin sender receiver
drop if sender == receiver

list, separator(0)

     +-------------------------------------+
     | sender   receiver   value   _fillin |
     |-------------------------------------|
  1. |      A          B     100         0 |
  2. |      A          C     200         0 |
  3. |      B          A     100         0 |
  4. |      B          C       .         1 |
  5. |      C          A       .         0 |
  6. |      C          B       .         1 |
     +-------------------------------------+