software military inglaterra check andalucia airline sas

military - sas uk



Creando variables ficticias de mĂșltiples cadenas en la misma fila (3)

Tengo un conjunto de datos que se ve así (tenga en cuenta que un espacio en blanco separa cada producto):

Client_ID Purchase 121212 "Orange_Juice Lettuce" 121212 "Banana Bread " 230102 "Banana Apple" 230102 "Chicken" 121212 "Chicken Bread" 301450 "Grapes Lettuce" ... ...

Ahora, deseo saber qué producto compra cada persona, usando una variable ficticia para cada artículo:

Client_ID Apple Banana Bread Chicken Grapes Lettuce Orange_Juice 121212 0 1 1 1 0 1 1 230102 1 1 0 1 0 0 0 301450 0 0 0 0 1 1 0 ... ... ... ... ... ... ... ...

Hace algunas semanas hice una pregunta similar , pero no tenía varios artículos en la misma fila, como es el caso aquí. Así que estoy realmente perdido. Traté de separar los artículos en varias columnas, pero eso no era lo ideal, ya que cada compra puede tener un número diferente de artículos (hasta docenas, por lo que sé).

Alguna idea de cómo proceder? ¡Gracias por adelantado!


Aquí hay una solución de programación de pasos de datos:

proc sort data=have; by client_id; run; data want(keep=client_id apple banana bread chicken grapes lettuce orange_juice); set have; by client_id; retain apple banana bread chicken grapes lettuce orange_juice; if first.client_id then do; apple = 0; banana = 0; bread = 0 ; chicken = 0; grapes = 0; lettuce = 0; orange_juice = 0; end; length item $20; _x = 1; item = scan(purchase,_x); do while(item ne '' ''); select(item); when(''Apple'') then apple = 1; when(''Banana'') then banana = 1; when(''Bread'') then bread = 1; when(''Chicken'') then chicken = 1; when(''Grapes'') then grapes = 1; when(''Lettuce'') then lettuce = 1; when(("Orange_Juice'') then orange_juice = 1; otherwise; end; _x = _x + 1; item = scan(purchase,_x); end; if last.client_id then output; run;

EDITAR: Me perdí la parte de la pregunta sobre más de un elemento en cada variable de PURCHASE . Gracias Joe!


Aquí hay una solución flexible que usa PROC FREQ y PROC TRANSPOSE. La opción SPARSE te da tus ceros. Supongo que solo quieres 1 o 0, de ahí el tipo NODUPKEY; elimine NODUPKEY (o elimine el género por completo) si desea 2 para BREAD para la primera ID.

Primero cree un conjunto de datos verticales con un registro por ID / Producto (dividiendo la Compra en Productos); luego PROC FREQ ese dataset para que tenga un conjunto de datos con 1/0 para cada combinación de cliente / producto; luego transponga eso usando el producto como ID y cuente como VAR.

Si tiene productos que desea garantizar que aparezcan como cero, incluso si nadie los tiene, debe agregar una fila a la tabla inicial (o cualquier otra cosa anterior a la frecuencia de proceso) con una identificación de cliente ficticia y TODOS los productos posibles, luego después la transposición elimina la identificación del cliente ficticio.

data test; input @1 Client_ID 6. @16 Purchase $50.; datalines; 121212 Orange_Juice Lettuce 121212 Banana Bread 230102 Banana Apple 230102 Chicken 121212 Chicken Bread 301450 Grapes Lettuce ;;;; run; data vert; set test; format product $20.; do _x = 1 by 1 until (missing(product)); product=scan(purchase,_x); if not missing(product) then output; end; run; proc sort data=vert nodupkey; by client_id product; run; proc freq data=vert; tables client_id*product/sparse out=prods; run; proc transpose data=prods out=horiz; by client_id; id product; var count; run;


También es una solución viable para permitir que el paso de datos SAS haga algunos de los códigos variables ficticios para usted.

data test; input Client_ID 6. Purchase $50.; datalines; 121212 Orange_Juice Lettuce 121212 Banana Bread 230102 Banana Apple 230102 Chicken 121212 Chicken Bread 301450 Grapes Lettuce ;;;; run; filename tmp temp; data _null_; set test end = done; file tmp; length product $25 prodlist $1000; retain prodlist; do i = 1 to countw( purchase, " " ); product = scan( purchase, i, " " ); prodlist = ifc( indexw( prodlist, product )=0, catx( '' '', prodlist, product ), prodlist ); end; if done then do; prodlinit=prxchange("s/ /=0; /",-1,compbl(prodlist)); put ''array prods(*) '' prodlist '';'' / prodlinit; end; run; data new; set test; %inc tmp/source2; do i = 1 to dim( prods ); if indexw(purchase,vname(prods(i))) > 0 then prods(i) = 1; end; run; proc print; run;