Stata 删除具有相同观察值的变量

Stata 删除具有相同观察值的变量,stata,Stata,我想删除数据集的所有变量,其中所有观测值都具有相同的值(-94) 我的做法如下: local abc *all variables of the dataset* tostring `abc', replace force foreach var of local abc { replace `abc' = "" if `abc' == "-94" } 但是,我收到一个类型不匹配错误,无法继续使用dropmiss命令 我的数据集有1900变量,但只有106观察值。变量是字符串和数字

我想删除数据集的所有变量,其中所有观测值都具有相同的值(
-94

我的做法如下:

local abc *all variables of the dataset*

tostring `abc', replace force

foreach var of local abc {
    replace `abc' = "" if `abc' == "-94"
}
但是,我收到一个类型不匹配错误,无法继续使用
dropmiss
命令

我的数据集有
1900
变量,但只有
106
观察值。变量是字符串和数字,因此我必须在开始时运行
tostring
命令

数据示例(仅包括要删除的变量):


考虑下面的玩具示例:

clear
set obs 10

generate v1 = -94 // numeric

forvalues i = 2 / 4 {
    generate v`i' = rnormal() // numeric
}

generate v5 = "-94" // string

list

     +-----------------------------------------------+
     |  v1          v2          v3          v4    v5 |
     |-----------------------------------------------|
  1. | -94    .1810702    .1617331   -.0910539   -94 |
  2. | -94   -2.472578     .884746   -.5641506   -94 |
  3. | -94   -1.259646   -.9369262    .0942772   -94 |
  4. | -94    .2986405    .2054719    -1.25441   -94 |
  5. | -94    .4703567    1.868845    .0574179   -94 |
     |-----------------------------------------------|
  6. | -94   -.5504516    .3403896   -1.720799   -94 |
  7. | -94   -1.504979    .0951505   -.4002379   -94 |
  8. | -94   -.6522541    1.021817   -2.524902   -94 |
  9. | -94    .9978508     -1.4657   -.5643548   -94 |
 10. | -94    .2728079    -.177151     1.16664   -94 |
     +-----------------------------------------------+
然后,您可以找到感兴趣的变量,如下所示:

destring *, replace

ds

foreach var in `r(varlist)' {
    quietly summarize `var'
    if `r(min)' == `r(max)' drop `var'
}

list

     +-----------------------------------+
     |        v2          v3          v4 |
     |-----------------------------------|
  1. |  .1810702    .1617331   -.0910539 |
  2. | -2.472578     .884746   -.5641506 |
  3. | -1.259646   -.9369262    .0942772 |
  4. |  .2986405    .2054719    -1.25441 |
  5. |  .4703567    1.868845    .0574179 |
     |-----------------------------------|
  6. | -.5504516    .3403896   -1.720799 |
  7. | -1.504979    .0951505   -.4002379 |
  8. | -.6522541    1.021817   -2.524902 |
  9. |  .9978508     -1.4657   -.5643548 |
 10. |  .2728079    -.177151     1.16664 |
     +-----------------------------------+
以下是另一种无需大量转换变量类型或外部命令的方法:

ds

foreach var in `r(varlist)' {
    capture assert `var' == `var'[1]
    if !_rc drop `var'
}

此示例足以说明Stata日志中的
findname
的使用。无需将所有数据转换为字符串或任何此类大规模转换

clear
input str7(ELi014c ELi014d) long(ELi012a ELi012b) foo 
"-94" "-94" -94 -94  1
"-94" "-94" -94 -94  2
"-94" "-94" -94 -94  3
"-94" "-94" -94 -94  4
"-94" "-94" -94 -94  5
end 

findname, all(@ == -94) local(bad1) 
findname, all(@ == "-94") local(bad2) 

drop `bad1' `bad2' 

list 

     +-----+
     | foo |
     |-----|
  1. |   1 |
  2. |   2 |
  3. |   3 |
  4. |   4 |
  5. |   5 |
     |-----|
有关此处代码错误或不明智原因的更多信息,请参阅。
clear
input str7(ELi014c ELi014d) long(ELi012a ELi012b) foo 
"-94" "-94" -94 -94  1
"-94" "-94" -94 -94  2
"-94" "-94" -94 -94  3
"-94" "-94" -94 -94  4
"-94" "-94" -94 -94  5
end 

findname, all(@ == -94) local(bad1) 
findname, all(@ == "-94") local(bad2) 

drop `bad1' `bad2' 

list 

     +-----+
     | foo |
     |-----|
  1. |   1 |
  2. |   2 |
  3. |   3 |
  4. |   4 |
  5. |   5 |
     |-----|