Изменить порядок текста в именах переменных - PullRequest
0 голосов
/ 09 октября 2018

У меня есть следующий набор данных:

* Example generated by -dataex-. To install: ssc install dataex
clear
input float(MA_234_AAF_US AL_87665_ACH_USA TX_3_GH_US LA_689_KLO_US KY_3435_Z_USA)
  9.96567 10.559998 12.935112 13.142867   9.35608
 9.758375     9.856 10.002945  8.090142 10.313352
11.594983  9.274136 12.486753  6.661111 10.529528
10.354564  9.893115 10.625778 13.265523  7.405652
  12.7978  10.76272 11.527348 10.112844  11.64973
 10.63846 11.040354  8.569465  8.781206 11.448466
 9.254233 13.808356 10.817062  9.545164  8.759109
  11.8417  10.15155  12.72436 11.102546 11.506034
 9.864883  9.864952  14.45111  10.12562  9.753519
 9.965327 11.517155  9.910269  8.988406 11.359774
end

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

US_MA_AAF_234   USA_AL_ACH_87665   US_TX_GH_3   US_LA_KLO_689   USA_KY_Z_3435

Я попробовал предоставленный кодв ответах на этот вопрос:

Однако я не смог заставить его работать.

Ответы [ 2 ]

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

Вот альтернативный подход.

Это хуже, чем использование rename в одной строке, что хорошо подходит для этой цели.Проверка покажет необходимое соответствие с этим подходом.Это зависит от имен, являющихся элементами, разделенными подчеркиванием, которые удаляются, а затем вставляются заново.

clear
input float(MA_234_AAF_US AL_87665_ACH_USA TX_3_GH_US LA_689_KLO_US KY_3435_Z_USA)
  9.96567 10.559998 12.935112 13.142867   9.35608
end

foreach name of var * { 
    local new = subinstr("`name'", "_", " ", .) 
    tokenize `new' 
    rename `name' `4'_`1'_`3'_`2' 
}

describe, fullnames 

Contains data
  obs:             1                          
 vars:             5                          
 size:            20                          
-------------------------------------------------------------------------------------------
              storage   display    value
variable name   type    format     label      variable label
-------------------------------------------------------------------------------------------
US_MA_AAF_234   float   %9.0g                 
USA_AL_ACH_87665
                float   %9.0g                 
US_TX_GH_3      float   %9.0g                 
US_LA_KLO_689   float   %9.0g                 
USA_KY_Z_3435   float   %9.0g                 
-------------------------------------------------------------------------------------------

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

Как указывает @PearlySpencer, операторы внутри цикла

local new = subinstr("`name'", "_", " ", .) 
tokenize `new' 
rename `name' `4'_`1'_`3'_`2' 

можно заменить на

tokenize `name', parse(_)
rename `name' `7'_`1'_`5'_`3' 

Разница в том, что подчеркивания будут помещены в локальные макросы 2, 4, 6.

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

Все три подхода из другого вопроса могут работать.

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

Таким образом, наилучшим подходом, вероятно, является использование встроенной команды rename:

clear

input float(MA_234_AAF_US AL_87665_ACH_USA TX_3_GH_US LA_689_KLO_US KY_3435_Z_USA)
  9.96567 10.559998 12.935112 13.142867   9.35608
end

<b>rename (*_#_*_*) (*[4]_*[1]_*[3]_#[2])</b>

list, abbreviate(20) noobs

  +-------------------------------------------------------------------------------+
  | US_MA_AAF_234   USA_AL_ACH_87665   US_TX_GH_3   US_LA_KLO_689   USA_KY_Z_3435 |
  |-------------------------------------------------------------------------------|
  |       9.96567              10.56     12.93511        13.14287         9.35608 |
  +-------------------------------------------------------------------------------+

Вам необходимо тщательно изучить использование спецификаторов в help rename group.

...