"Возведение в квадрат" набора данных - PullRequest
3 голосов
/ 07 июня 2019

У меня есть набор растений (A, B, C), которые могут выступать как отправителями, так и получателями, но на практике не все фактически отправляют или получают.Мне нужно заполнить пропущенные соединения, чтобы сделать матрицу данных «квадратной» (или «квадратичной»), а не ее прямоугольник.

Вот мои данные:

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

Stata's *Команда 1009 * почти выполняет то, что я хочу:

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 ]

2 голосов
/ 07 июня 2019

Это более общий шаг, чем решение @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 голос
/ 07 июня 2019

Вам необходимо предоставить 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 |
     +-------------------------------------+
...