How can I list negative values across my dataset?

孤人 提交于 2019-12-11 04:14:52

问题


I am using a dataset with about 100 variables and 1000 rows, similar to the one below:

.      var1  var2  var3  var4
AL      10    11    12     13 
AK      -1    0      0     18
AZ      5     -5    -2     22
VA      15    16     0      0

How can I list the variables / observations that have a negative value?

For example, I would like to list that AK has negative var1 and AZ has negative var2 and var3.


回答1:


Here's an example of how you can create a marker variable for each of your var variables:

clear

input   str2 state  var1  var2  var3  var4
AL      10    11    12     13 
AK      -1    0      0     18
AZ      5     -5    -2     22
VA      15    16     0      0
end

foreach var in var1 var2  var3  var4 {
    generate tag_`var' = `var' < 0
}

list

     +-------------------------------------------------------------------------------+
     | state   var1   var2   var3   var4   tag_var1   tag_var2   tag_var3   tag_var4 |
     |-------------------------------------------------------------------------------|
  1. |    AL     10     11     12     13          0          0          0          0 |
  2. |    AK     -1      0      0     18          1          0          0          0 |
  3. |    AZ      5     -5     -2     22          0          1          1          0 |
  4. |    VA     15     16      0      0          0          0          0          0 |
     +-------------------------------------------------------------------------------+

You can then do the following:

list state var1 if tag_var1 == 1

     +--------------+
     | state   var1 |
     |--------------|
  2. |    AK     -1 |
     +--------------+

or

list state var* if tag_var1 == 1 | tag_var2 == 1 | tag_var3 == 1 | tag_var4 == 1

     +-----------------------------------+
     | state   var1   var2   var3   var4 |
     |-----------------------------------|
  2. |    AK     -1      0      0     18 |
  3. |    AZ      5     -5     -2     22 |
     +-----------------------------------+

If you do not need the extra flexibility of a marker variable you can simply do:

list state var1 if var1 < 0

EDIT:

Alternatively you could do the following:

preserve

generate obsno = _n
reshape long var, i(obsno)

rename var value
generate var = "var" + string(_j)

list state var obsno value if value < 0, noobs sepby(state)

  +------------------------------+
  | state    var   obsno   value |
  |------------------------------|
  |    AK   var1       2      -1 |
  |------------------------------|
  |    AZ   var2       3      -5 |
  |    AZ   var3       3      -2 |
  +------------------------------+

restore



回答2:


There are two other techniques that can be mentioned. One is to calculate the minimum in each observation (row) and then list if and only if that minimum is negative. That way, you get any zeros, positives and missings too in the same observations.

The other is just to loop over the variables and list separately.

clear 
input str2 state   var1  var2  var3  var4
AL      10    11    12     13 
AK      -1    0      0     18
AZ      5     -5    -2     22
VA      15    16     0      0
end 

egen min = rowmin(var*) 

list if min < 0 

     +-----------------------------------------+
     | state   var1   var2   var3   var4   min |
     |-----------------------------------------|
  2. |    AK     -1      0      0     18    -1 |
  3. |    AZ      5     -5     -2     22    -5 |
     +-----------------------------------------+


foreach v of var var* { 
    quietly count if `v' < 0 
    if r(N) list `v' if `v' < 0 
} 

     +------+
     | var1 |
     |------|
  2. |   -1 |
     +------+

     +------+
     | var2 |
     |------|
  3. |   -5 |
     +------+

     +------+
     | var3 |
     |------|
  3. |   -2 |
     +------+


来源:https://stackoverflow.com/questions/52951589/how-can-i-list-negative-values-across-my-dataset

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!