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

Я пытаюсь rename около 100 фиктивных переменных со значениями из отдельной переменной.

У меня есть переменная products, которая хранит информацию о том, какие продукты продает компания, и сгенерировала фиктивную переменную для каждого продукта, используя:

tab products, gen(productid)

Однако переменные названы productid1, productid2 и так далее.Я хотел бы, чтобы эти переменные взяли значения переменной products.

Есть ли способ сделать это в Stata без переименования каждой переменной по отдельности?

Редактировать:

Вот пример данных, которые будутиспользоваться.В столбце продукта будут дубликаты.

enter image description here

И затем я запустил команду tab, чтобы создать фиктивную переменную для каждого продукта для производстваследующая таблица.

sort product
tab product, gen(productid)

enter image description here

Я заметил, что обновляет метки, чтобы показать, что представляет каждая переменная.enter image description here

То, что я хотел бы сделать, это присвоить значение в качестве имени переменной, например commercial, вместо productid1 и так далее.

Ответы [ 3 ]

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

Произвольные строки могут быть недопустимыми именами переменных Stata.Это произойдет, если они (а) слишком длинные;(б) начинаться с любого символа, кроме буквы или подчеркивания;(c) содержать символы, отличные от букв, цифр и подчеркиваний;или (d) идентичны существующим именам переменных.Возможно, было бы лучше превратить строки в переменные метки, где укусы ограничены только 80 символами.

Этот код перебирает переменные и делает все возможное:

gen long obs = _n 

foreach v of var productid? productid?? productid??? {
     su obs if `v' == 1, meanonly 
     local tryit = product[r(min)] 
     capture rename `v' `=strtoname("`tryit'")' 
} 

Примечание: код не проверен.

РЕДАКТИРОВАТЬ: Вот тест.Я добавил код для меток переменных.Пример данных и код показывают, что допускаются повторяющиеся значения и значения, которые не могут быть именами переменных.

clear

input str13 products
"one"
"two"
"one" 
"three"
"four"
"five"
"six something" 
end

tab products, gen(productsid) 

gen long obs = _n 

foreach v of var productsid*{
     su obs if `v' == 1, meanonly 
     local value = products[r(min)] 
     local tryit = strtoname("`value'") 
     capture rename `v' `tryit' 
     if _rc == 0 capture label var `tryit' "`value'" 
     else label var `v' "`value'" 
} 

drop obs 

describe 

Contains data
  obs:             7                          
 vars:             7                          
 size:           133                          
-------------------------------------------------------------------------------
              storage   display    value
variable name   type    format     label      variable label
-------------------------------------------------------------------------------
products        str13   %13s                  
five            byte    %8.0g                 five
four            byte    %8.0g                 four
one             byte    %8.0g                 one
six_something   byte    %8.0g                 six something
three           byte    %8.0g                 three
two             byte    %8.0g                 two
-------------------------------------------------------------------------------
0 голосов
/ 14 октября 2018

Другим решением является использование расширенной функции макроса

local varlabel:variable label

Протестированный код:

clear
input companyid str10 product
1 "P2P"
2 "Retail"
3 "Commercial"
4 "CreditCard"
5 "CreditCard"
6 "EMFunds"
end

tab product, gen(product_id)

* get the list of product id variables
ds product_id*

* loop through the product id variables and change the 
variable name to its label
foreach var of varlist `r(varlist)' {
local varlabel: variable label `var'
display "`varlabel'"
local pos = strpos("`varlabel'","==")+2
local varlabel = substr("`varlabel'",`pos',.)
display "`varlabel'"
rename `var' `varlabel'
}
0 голосов
/ 05 октября 2018

Используя данные вашего примера:

clear

input companyid str10 product
1 "P2P"
2 "Retail"
3 "Commercial"
4 "CreditCard"
5 "CreditCard"
6 "EMFunds"
end

tabulate product, generate(productid)
list, abbreviate(10)

sort product
levelsof product, local(new) clean
tokenize `new'

ds productid*

local i 0
foreach var of varlist `r(varlist)' {
    local ++i
    rename `var' ``i''      
}

Создает желаемый результат:

list, abbreviate(10)

     +---------------------------------------------------------------------------+
     | companyid      product   Commercial   CreditCard   EMFunds   P2P   Retail |
     |---------------------------------------------------------------------------|
  1. |         3   Commercial            1            0         0     0        0 |
  2. |         5   CreditCard            0            1         0     0        0 |
  3. |         4   CreditCard            0            1         0     0        0 |
  4. |         6      EMFunds            0            0         1     0        0 |
  5. |         1          P2P            0            0         0     1        0 |
  6. |         2       Retail            0            0         0     0        1 |
     +---------------------------------------------------------------------------+
...