Variables de cadena

Las variables de cadena, en pocas palabras, son variables que contienen no solo números, sino también otros caracteres (posiblemente mezclados con números). Por ejemplo, la Encuesta Social Europea almacena información sobre el país donde se encuestó a los encuestados en la variable cntry, que contiene cadenas como «DE», «ES»,» LT», etc. Otro término que se usa a menudo es variables «alfanuméricas», obviamente refiriéndose al» alfabeto » y, por lo tanto, a las letras. Pero en realidad una variable de cadena puede contener caracteres como «\» o «-» o «:»y así sucesivamente, cualquier cosa que un teclado pueda producir.

La primera sección se centrará en el tema de la transformación de cadenas en variables numéricas. La segunda sección presentará algunas otras cosas que encontré útiles. Pero en primer lugar voy a emitir un …

Advertencia

A partir de la versión 14, Stata admite Unicode (UTF-8). Si no sabes lo que eso significa — se trata de cómo se codifican digitalmente los caracteres en tu computadora. (Has oído que las computadoras usan bits, bytes y cosas así para representar información. Si escribe y guarda una» a», no encontrará una» a «en su disco duro, sino un código de computadora que se transforma en una» a » en su pantalla o en la impresora. Unicode es mucho más universal que codificaciones anteriores como ASCII o ANSII. Permite que se representen toneladas de caracteres, incluidos muchos de los numerosos idiomas que no usan los caracteres que está viendo aquí (derivados del alfabeto latino y en la mayoría de las partes idénticos a los del alfabeto latino), sino cirílico, tailandés o lo que sea.

No entraré en detalles aquí, pero solo quiero alertarte de que las nuevas posibilidades para tratar con caracteres Unicode no están cubiertas aquí. Tenga en cuenta en particular que para algunas funciones de cadena (como substr()) ahora hay funciones equivalentes para tratar especialmente con caracteres Unicode. Estas funciones tienen nombres que son compuestos de u más la función convencional, por ejemplo, usubstr(). Tenga en cuenta que mientras se limite a caracteres del código ASCII original (algo que he estado enseñando y predicando durante décadas), no hay necesidad de preocuparse. Pero por lo demás, tenga en cuenta que algunas cosas podrían funcionar de manera diferente con Stata 14.

Por ejemplo, los umlaute alemanes se representan de manera diferente en Stata 13 y Stata 14, y esto tiene consecuencias más allá de la visualización de caracteres. Como ejemplo, la palabra (alemana) für es una cadena de longitud tres en Stata 13, pero la longitud de la cadena es cuatro en Stata 14. Esto también influye en los resultados de funciones como strlen(). Como strlen()se refiere a la memoria utilizada (y no al número de caracteres que aparecen en la pantalla), el resultado de strlen(für) también será 4 en Stata 14 en contraste con 3 en Stata 13. La nueva función ustrlen(für), en cambio, producirá 3. En otras palabras, las funciones «ustring» se refieren al número de caracteres que aparecen al ojo humano, no a la cantidad de memoria necesaria.

De variables de cadena a variables numéricas

Aunque Stata puede manejar variables de cadena, está claro en muchos aspectos que las variables numéricas son muy preferidas. No menos importante, la mayoría de los procedimientos estadísticos simplemente no aceptan variables de cadena. Afortunadamente, Stata ofrece algunas formas fáciles de convertir cadenas en variables numéricas (y viceversa).

Variables de»solo cadena»

A veces, las variables de cadena representan propiedades. Esto podría ser «masculino» y » femenino «(más» gay»,» queer», o lo que quieras, incluso si esto sigue siendo muy raro en los datos de ciencias sociales). O podrían ser los códigos de país mencionados en la introducción, es decir, «DE», «ES»,» UK», US», etc. Si necesita transformar esto en una variable numérica, cada categoría debe estar representada por un número diferente. Cambiar de cadena a numérico es fácil, con encode como el comando de su elección:

codificar cntry, gen (cntrynum)

convertirá cntry en una variable numérica, con los caracteres de la variable de cadena anterior como etiquetas de valor.

Si por alguna razón desea convertir una variable numérica en una variable de cadena, puede usar la función complementaria decode. No es sorprendente que Stata requiera que la variable numérica esté etiquetada; estas etiquetas se usarán como cadenas para representar los diferentes valores.

Números «disfrazados» como cadenas

Un caso especial son variables donde los valores numéricos se almacenan como una variable de cadena, incluidos los casos en que los valores numéricos se almacenan junto con algunos caracteres (irrelevantes). El procedimiento destring ofrece formas de convertir una variable de este tipo en una variable numérica, dejando los valores originales sin cambios (si consisten solo en números) o eliminando cualquier carácter no numérico.

La forma general del comando es

destring varname (s), options

con al menos una opción requerida. Las opciones más importantes son:

  • generate(newvarnames): crea nuevas variables
  • replace: reemplaza la(s) variable (s) anterior (es))
  • ignore("char1" ): elimina los caracteres «char1», «char2», etc.
  • force: cambia todas las variables que contienen caracteres no mencionados en force a faltantes

No es sorprendente que Stata también ofrezca el comando tostring que funciona al revés.

Transformaciones de datos para variables de cadena

Lo que sigue es una colección bastante heterogénea. En particular, hay docenas de funciones que se refieren a variables de cadena, y cubriré solo una selección muy pequeña y arbitraria.

split

split es un comando que funciona en una variable de cadena. Muy obviamente, lo dividirá en dos partes o más; lo hará creando nuevas variables mientras deja la variable antigua sin cambios. Lo hace si hay algo en la variable original que separa esas partes. De forma predeterminada, este separador es un espacio. Por lo tanto, dividir una variable que contenga «Joe Brady» dará como resultado dos nuevas variables, una que contenga «Joe» y la otra que contenga «Brady». Tenga en cuenta que si hay una persona llamada «Joe F. Brady», el resultado será de tres variables.

split name La variable » name «se dividirá en variables» name1″,» name2″, etc., siempre que contenga espacios en blanco, por supuesto. El número de variables nuevas será igual al número de espacios en blanco más 1.

split name, parse(,) El «nombre» de la variable se dividirá mediante comas en lugar de espacios en blanco como separadores. Puede indicar varios separadores; además, los separadores pueden consistir en más de un carácter.

split lnum, destring Las partes de «lnum» que realmente representan números se convertirán en variables numéricas, pero solo si hay números en toda una variable nueva dada. Por ejemplo, si la variable «lnum» es «60 30» para un caso y «50 ab» para otro, la nueva variable «lnum1» será numérica (con valores 60 y 50), mientras que «lnum2» seguirá siendo una variable de cadena (y aunque el valor de esta variable será 30 para el primer caso, seguirá tratándose como una cadena)

split lnum, destring forceTodas las nuevas variables serán numéricas. Sin embargo, siempre que aparezca una información no numérica, el valor faltará. Por ejemplo, si «lnum «es» 60 b30″, faltará el valor de» lnum2″.

split lnum, destring force ignore(abcd) Todas las nuevas variables serán numéricas. Cualquier carácter «a», «b», «c» o «d» se eliminará. Por lo tanto, en el ejemplo anterior «b30» se convertirá en «30» y el resultado será de hecho una variable numérica.

split lnum, generate(ln) La variable » lnum «se dividirá en variables» ln1″,» ln2″, etc.

egen with ends()

Esta función extraerá una» parte «de una variable de cadena (en contraste con el comando split, que creará tantas variables nuevas como haya»partes»). Lo que es una parte se define por un separador. Irónicamente, por defecto ends() extraerá la primera parte (o head, como se le llama en el manual de Stata). Con todo, hay tres posibilidades:

egen firstname = ends(name)Esto extraerá cualquier cosa que aparezca en» nombre » antes de la primera aparición del separador, que por defecto es un espacio en blanco. Esto equivale a egen firstname = ends(name), head. Si no hay separador, la cadena completa contenida en «name» volverá a aparecer en «firstname»

egen lastname = ends(name), lastEsto extraerá cualquier cosa que aparezca en» nombre » después de la última aparición del separador. De nuevo, si no hay separador, todo el contenido de «nombre» se representará en «apellido».

egen endofname = ends(name), tail Esto extraerá cualquier cosa que aparezca en» nombre » después de la primera aparición del separador. Si no hay separador, el resultado será una cadena vacía.

El separador puede indicarse con punct(,). Por lo tanto, egen firstname = ends(name) punct(,)extraerá cualquier cosa que aparezca en «nombre» antes de la primera aparición de una coma. Otros separadores son posibles, incluidos los que constan de varios caracteres, pero no se pueden indicar varios separadores.

strmatch ()

Esto se puede usar junto con generate/replace. Parece una «palabra», o más exactamente, una secuencia de caracteres, como en:

gen newvar = strmatch(oldvar, «somecharacters»)

Variable «newvar» tendrá un valor de 1 si «oldvar» consiste en la secuencia de «somecharacters». Sin embargo, si solo está buscando «algunos caracteres» para que aparezcan en algún lugar de «oldvar», puede usar

gen newvar = strmatch(oldvar, «*algunos caracteres*»)

que buscará «algunos caracteres» para que aparezcan en cualquier lugar. Escribir

gen newvar = strmatch (oldvar, «*somecharacters»)

hará que Stata busque » somecharacters «al final de» oldvar», sin importar cuántos caracteres precedan a»somecharacters». Por supuesto, también se puede usar "somecharacters*".