Просмотрите все строки и столбцы, которые содержат ноль - PullRequest
0 голосов
/ 24 октября 2018

Предположим, у меня есть 100 переменных с именем ID, var1, var2, ..., var99.У меня 1000 рядов.Я хочу просмотреть все строки и столбцы, которые содержат 0.

Я хотел просто сделать это:

browse ID, var* if var* == 0

, но это не работает,Я не хочу жестко кодировать все 99 переменных, очевидно.

Я хотел бы написать, по существу, следующую фразу:

gen has0 = 0
forvalues n = 1/99 {
  if var`n' does not contain 0 {
    drop v
  } // pseudocode I know doesn't work
  has0 = has0 | var`n' == 0
}
browse if has0 == 1

, но, очевидно, это не сработает.

Мне просто нужно изменить форму данных, чтобы они имели 2 столбца ID, var с общим количеством строк 100 000?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Мой дорогой коллега @NickCox заставляет меня ответить на этот (дублирующий) вопрос, потому что он утверждает, что загрузка, установка и запуск новой команды лучше, чем использование встроенных команд, когда вам «нужно»выбрать из 99 переменных ".

Рассмотрим следующий игрушечный пример:

clear

input var1 var2 var3 var4 var5
1 4 9 5 0
1 8 6 3 7
0 6 5 6 8
4 5 1 8 3
2 1 0 2 1
4 6 7 1 9
end

list

     +----------------------------------+
     | var1   var2   var3   var4   var5 |
     |----------------------------------|
  1. |    1      4      9      5      0 |
  2. |    1      8      6      3      7 |
  3. |    0      6      5      6      8 |
  4. |    4      5      1      8      3 |
  5. |    2      1      0      2      1 |
  6. |    4      6      7      1      9 |
     +----------------------------------+

На самом деле вам не нужно ничего скачивать:

preserve

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

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

list var obsno value if value == 0, noobs

  +----------------------+
  |  var   obsno   value |
  |----------------------|
  | var5       1       0 |
  | var1       3       0 |
  | var3       5       0 |
  +----------------------+

levelsof var if value == 0, local(selectedvars) clean

display "`selectedvars'"
var1 var3 var5

restore

Это подходя рекомендовал в связанном вопросе для определения отрицательных значений.Используя levelsof, можно сделать то же самое с findname, используя встроенную команду .

Это решение также можно адаптировать для browse:

preserve

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

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

browse var obsno value if value == 0

levelsof var if value == 0, local(selectedvars) clean

display "`selectedvars'"

pause

restore

Хотя я не понимаю, почему можно browse результаты, когда можно просто list их.


РЕДАКТИРОВАТЬ:

Вотпример, более похожий на набор данных OP:

clear
set seed 12345
set obs 1000

generate id = int((_n - 1) / 300) + 1

forvalues i = 1 / 100 {
    generate var`i' = rnormal(0, 150)
}

ds var*

foreach var in `r(varlist)' {
    generate rr = runiform()
    replace `var' = 0 if rr < 0.0001
    drop rr
}

Применение вышеуказанного решения дает:

display "`selectedvars'"
var13 var19 var35 var36 var42 var86 var88 var90

list id var obsno value if value == 0, noobs sepby(id)

  +----------------------------+
  | id     var   obsno   value |
  |----------------------------|
  |  1   var86      18       0 |
  |  1   var19     167       0 |
  |  1   var13     226       0 |
  |----------------------------|
  |  2   var88     351       0 |
  |  2   var36     361       0 |
  |  2   var35     401       0 |
  |----------------------------|
  |  3   var42     628       0 |
  |  3   var90     643       0 |
  +----------------------------+
0 голосов
/ 24 октября 2018

Краткий ответ: подстановочные знаки для групп переменных не могут быть вставлены в квалификаторы if.(Команда if отличается от квалификатора if.)

Ваш вопрос противоречив в том, что вы хотите.В какой-то момент ваш псевдокод содержит drop переменных ping!drop имеет явное, разрушительное значение для программистов Stata: оно не означает «игнорировать».

Но давайте остановимся на browse.

findname, any(@ == 0) 

находит переменные, для которых любое значение равно 0. search findname, sj, чтобы найти последнюю загружаемую версию.

Также обратите внимание, что

findname, type(numeric) 

вернет числовые переменные в r(varlist) (а также локальный макрос, если вы укажете это).

Тогда несколько egen функций соревнуются за поиск 0 в каждом наблюдении для указанного varlist : команда findname, очевидно, помогает вам определить, какой varlist .

Давайте создадим небольшую песочницу для демонстрации техники:

clear
set obs 5 
gen ID = _n 
forval j = 1/5 { 
    gen var`j' = 1
}
replace var2 = 0 in 2 
replace var3 = 0 in 3 

list 

findname var*, any(@ == 0) local(which) 
egen zero = anymatch(`which'), value(0) 

list `which' if zero 

     +-------------+
     | var2   var3 |
     |-------------|
  2. |    0      1 |
  3. |    1      0 |
     +-------------+

Итак, проблема разбита на две части: поиск наблюдений с любыми нулями и поиск наблюдений с любыми нулями, а затем добавлениеинформация вместе.

Естественно, использование findname нецелесообразно, так как вы можете просто написать свой собственный цикл для определения представляющих интерес переменных:

local wanted 

quietly foreach v of var var* { 
    count if `v' == 0 
    if r(N) > 0 local wanted `wanted' `v' 
}

Столь же естественно, вы можете browse такжекак list: разница только в имени команды.

...