Подсчет символов в нескольких переменных - PullRequest
0 голосов
/ 14 сентября 2018

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

Например:

* Example generated by -dataex-. To install: ssc install dataex
clear
input str1(var1 var2 var3 var4 var5 var6 var7 var8 var9 var10)
"+" "+" "+" "+" "+" "+" "+" "+" "+" "+"
"+" "+" "+" "+" "+" "+" "-" "+" "-" "+"
"+" "-" "-" "-" "+" "+" "+" "+" "+" "?"
"+" "+" "+" "+" "+" "+" "-" "-" "-" "-"
"+" "+" "+" "+" "+" "*" "*" "*" "*" "*"
"+" "+" "+" "+" "-" "-" "-" "*" "*" "*"
"+" "*" "+" "+" "+" "+" "+" "+" "+" "+"
"+" "+" "+" "+" "-" "-" "-" "-" "-" "-"
"-" "-" "-" "-" "-" "-" "+" "+" "+" "+"
"+" "+" "+" "+" "+" "+" "+" "+" "+" "+"
end

Как я могу посчитать их, если все мои переменные являются строками?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я бы сделал это исключительно из-за манипуляций со струнами.Если мы объединяем все в одну строку, мы можем посчитать любой символ, который пожелаем, следующим устройством: притворимся, что заменяем каждый экземпляр этого символа ничем (поэтому притворимся, что удалили его), а затем посмотрим, насколько короче строка.Этот трюк был написан в этой статье 2011 года, доступной для всех .

Подсчет звездочек - это еще один пример.

Объединенная комбинация имеет другое применение, особенно если переменные ссылаются на последовательность или историю какого-либо рода.

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

clear
input str1(var1 var2 var3 var4 var5 var6 var7 var8 var9 var10)
"+" "+" "+" "+" "+" "+" "+" "+" "+" "+"
"+" "+" "+" "+" "+" "+" "-" "+" "-" "+"
"+" "-" "-" "-" "+" "+" "+" "+" "+" "?"
"+" "+" "+" "+" "+" "+" "-" "-" "-" "-"
"+" "+" "+" "+" "+" "*" "*" "*" "*" "*"
"+" "+" "+" "+" "-" "-" "-" "*" "*" "*"
"+" "*" "+" "+" "+" "+" "+" "+" "+" "+"
"+" "+" "+" "+" "-" "-" "-" "-" "-" "-"
"-" "-" "-" "-" "-" "-" "+" "+" "+" "+"
"+" "+" "+" "+" "+" "+" "+" "+" "+" "+"
end

egen all = concat(var*) 

gen plus = 10 - length(subinstr(all, "+", "", .)) 
gen minus = 10 - length(subinstr(all, "-", "", .)) 
gen question = 10 - length(subinstr(all, "?", "", .)) 

list all plus minus question, sep(0) 

     +--------------------------------------+
     |        all   plus   minus   question |
     |--------------------------------------|
  1. | ++++++++++     10       0          0 |
  2. | ++++++-+-+      8       2          0 |
  3. | +---+++++?      6       3          1 |
  4. | ++++++----      6       4          0 |
  5. | +++++*****      5       0          0 |
  6. | ++++---***      4       3          0 |
  7. | +*++++++++      9       0          0 |
  8. | ++++------      4       6          0 |
  9. | ------++++      4       6          0 |
 10. | ++++++++++     10       0          0 |
     +--------------------------------------+
0 голосов
/ 14 сентября 2018

Сначала замените каждый символ числом и используйте destring для преобразования переменных в числовое значение:

ds var*
local varlist `r(varlist)'

foreach var of local varlist {
    replace `var' = "1" if `var' == "+"
    replace `var' = "2" if `var' == "-"
    replace `var' = "3" if `var' == "*"
    replace `var' = "4" if `var' == "?"
}

destring var*, replace

Затем вы можете получить счет с помощью функции anycount() команды egen:

forvalues i = 1 / 4 { 
    egen var`i's = anycount(`varlist'), val(`i')
}

list var*s 

      +-------------------------------+
     | var1s   var2s   var3s   var4s |
     |-------------------------------|
  1. |    10       0       0       0 |
  2. |     8       2       0       0 |
  3. |     6       3       0       1 |
  4. |     6       4       0       0 |
  5. |     5       0       5       0 |
     |-------------------------------|
  6. |     4       3       3       0 |
  7. |     9       0       1       0 |
  8. |     4       6       0       0 |
  9. |     4       6       0       0 |
 10. |    10       0       0       0 |
     +-------------------------------+

Обратите внимание, что вы можете использовать переменные с разными именами с помощью команды ds.

...