software military inglaterra estadistica check andalucia airline sas

military - sas software



SAS: ¿Cómo señalo una observación específica de un valor? (2)

Hay varias formas de hacer esto; aquí hay uno que usa la opción SAS POINT=

data have; input ID Number; datalines; 1 2 2 5 3 6 4 1 run; data want; retain adder; drop adder; if _n_=1 then do; adder = 3; set have point=adder; adder = number; end; set have; number = number + adder; run;

Las instrucciones RETAIN y DROP definen una variable temporal para mantener el valor que desea agregar. RETAIN significa que el valor no debe reinicializarse para que falte cada vez que pasa el paso de datos y DROP significa que no desea incluir esa variable en el conjunto de datos de salida.

La opción POINT= permite leer una observación específica de un conjunto de datos SAS. La parte _n_=1 es un mecanismo de control para ejecutar solo ese bit de código una vez, asignando el adder variable al valor de la tercera observación.

La siguiente sección lee el conjunto de datos una observación a la vez y agrega su cambio.

Tenga en cuenta que el mismo conjunto de datos se lee dos veces; una práctica función de SAS.

Soy nuevo en SAS y estoy tratando de descubrir algunas cosas básicas disponibles en otros idiomas.

Tengo una mesa

ID Number -- ------ 1 2 2 5 3 6 4 1

Me gustaría crear una nueva variable en la que sume el valor de una observación de Número para cada una de las observaciones, como

Number2 = Number + Number[3] ID Number Number2 -- ------ ------ 1 2 8 2 5 11 3 6 12 4 1 7

¿Cómo obtengo el valor de la tercera observación de Número y lo agrego a cada observación de Number en una nueva variable?


Comenzaré sugiriendo que Base SAS realmente no funciona de esta manera, normalmente; no es que no pueda, pero normalmente puede resolver la mayoría de los problemas sin señalar una fila específica.

Entonces, si bien esta respuesta resolverá su problema explícito, probablemente no sea algo útil en un escenario del mundo real; generalmente en el mundo real, usted tiene una clave de coincidencia o algún otro elemento que no sea ''número de fila'' para combinar, y si lo hiciera, podría hacerlo de manera mucho más eficiente. También es probable que pueda reorganizar su estructura de datos de una manera que hace que esta operación sea más conveniente.

Dicho eso, el ejemplo específico que das es trivial:

data have; input ID Number; datalines; 1 2 2 5 3 6 4 1 ;;;; run; data want; set have; _t = 3; set have(rename=number=number3 keep=number) point=_t ; number2=number+number3; run;

Si tiene SAS / IML (lenguaje matricial de SAS), que es algo similar a R, esta es una historia muy diferente, tanto en su probabilidad de realizar esta operación como de cómo lo haría.

proc iml; a= {1 2, 2 5, 3 6, 4 1}; *create initial matrix; b = a[,2] + a[3,2]; *create a new matrix which is the 2nd column of a added elementwise to the value in the third row second column; c = a||b; *append new matrix to a - could be done in same step of course; print b c; quit;

Para hacer esto con la primera observación, es mucho más fácil.

data want; set have; retain _firstpoint; *prevents _firstpoint from being set to missing each iteration; if _n_ = 1 then _firstpoint=number; *on the first iteration (usually first row) set to number''s value; number = number - _firstpoint; *now subtract that from number to get relative value; run;

Elaboraré un poco más sobre esto. SAS trabaja en un nivel de registro por registro, donde cada registro se procesa de manera independiente en el paso DATA. (PROCs por otro lado puede no comportarse de esta manera, aunque muchos lo hacen en algún nivel). SAS, al igual que SQl y bases de datos similares, no reconoce realmente que cualquier fila sea "primera" o "segunda" o "enésima"; sin embargo, a diferencia de SQL, te permite fingir que sí, basado en el tipo actual. El método de punto de acceso aleatorio es una forma de hacerlo.

La mayoría de las veces, sin embargo, vas a utilizar algo en los datos para determinar lo que quieres hacer en lugar de algo relacionado con el orden de los datos. Esta es una forma en que podría hacer lo mismo que en el método POINT =, pero usando el valor de ID:

los datos quieren; si n = 1, entonces configure have (where = (ID = 3) rename = number = number3); establecer tener; número2 = número + número3; correr;

Que en la primera iteración del paso de datos ( _N_ = 1) toma la fila de HAVE donde Id = 3, y luego toma las líneas de tener en orden (realmente lo hace :)

*check to see if _n_=1; it is; so take row id=3; *take first row (id=1); *check to see if _n_=1; it is not; *take second row (id=2); ... continue ...

Las variables que están en una instrucción SET se retienen automáticamente, por lo que NUMBER3 se retiene automáticamente (¡yay!) Y no se establece como faltante entre las iteraciones del ciclo de paso de datos. Siempre que no modifique el valor, permanecerá para cada iteración.