在某些情况下,我试图连接字符串变量。假设要说明以下数据。
DATA LIST FREE /USER_ID(F2.0) SHOP(A5) PRODUCT(A8).
BEGIN DATA
1 SHOP1 PRODUCT1
1 SHOP1 PRODUCT2
1 SHOP2 PRODUCT1
1 SHOP2 PRODUCT4
2 SHOP1 PRODUCT1
2 SHOP2 PRODUCT2
2 SHOP3 PRODUCT3
END DATA.
AUTORECODE SHOP PRODUCT /INTO COD_SHOP COD_PRODUCT.
DELETE VARIABLES SHOP PRODUCT.
RENAME VARIABLES COD_SHOP = SHOP.
RENAME VARIABLES COD_PRODUCT = PRODUCT.
EXECUTE.
我要针对相同的USER_ID
和SHOP
创建一个名为BOUGHT
的新变量,并遵循一些规则使用产品名称。
对于相同的USER_ID
和SHOP
:
PRODUCT1 THEN BOUGHT IS 'PRODUCT1'
IF PRODUCT4 THEN BOUGHT IS 'PRODUCT4'
IF PRODUCT1 AND PRODUCT4 THEN BOUGHT IS 'PRODUCT1 + PRODUCT4'
IF PRODUCT2 OR PRODUCT3 THEN BOUGHT IS 'PRODUCT MIX'.
我尝试过的
IF (PRODUCT = 1) USER_PRODUCT_1 = 1.
IF (PRODUCT = 2) USER_PRODUCT_2 = 1.
IF (PRODUCT = 3) USER_PRODUCT_3 = 1.
IF (PRODUCT = 4) USER_PRODUCT_4 = 1.
SORT CASES BY USER_ID SHOP.
AGGREGATE
/OUTFILE *
/BREAK = USER_ID SHOP
/PRODUCT1 = MAX(USER_PRODUCT_1)
/PRODUCT2 = MAX(USER_PRODUCT_2)
/PRODUCT3 = MAX(USER_PRODUCT_3)
/PRODUCT4 = MAX(USER_PRODUCT_4)
.
这样,我将以相同的USER_ID
和SHOP
知道所购买的产品。然后创建变量BOUGHT
STRING BOUGHT(A60).
DO IF (PRODUCT1 = 1). BOUGHT = 'PRODUCT1'
ELSE IF. (PRODUCT4 =1) BOUGHT = 'PRODUCT4'
ELSE IF. (PRODUCT1 = 1 & PRODUCT4 = 1) BOUGHT = 'PRODUCT1 + PRODUCT4'.
ELSE. BOUGHT = 'PRODUCT MIX'
END IF.
EXECUTE.
这只是一个简单的例子。我的产品比这更多,在最终变量BOUGHT中,有些产品与某些特定名称组合在一起,但其他产品则需要串联在一起。在这种情况下使用IF条件将需要大量工作。我该怎么办?
答案 0 :(得分:0)
我认为在一定条件下,您可能需要在某种程度上使用IF
。在不知道您需要适应的特定“产品”组合的情况下,我会尽力提供一种通用方法。
假设您有8种产品。与您一样,我们会将它们汇总到USER_ID
到SHOP
级别(尽管跳过了创建单个PRODUCT变量的中间步骤)。
SORT CASES BY USER_ID SHOP.
AGGREGATE
/OUTFILE=*
/PRESORTED
/BREAK = USER_ID SHOP
/PRODUCT1 = CIN(PRODUCT,1,1)
/PRODUCT2 = CIN(PRODUCT,2,2)
/PRODUCT3 = CIN(PRODUCT,3,3)
/PRODUCT4 = CIN(PRODUCT,4,4)
/PRODUCT5 = CIN(PRODUCT,5,5)
/PRODUCT6 = CIN(PRODUCT,6,6)
/PRODUCT7 = CIN(PRODUCT,7,7)
/PRODUCT8 = CIN(PRODUCT,8,8) .
现在,我们创建变量BOUGHT
来跟踪给定USER_ID
和SHOP
可能出现的所有产品组合。
STRING BOUGHT(A100) .
VECTOR PRODUCT = PRODUCT1 TO PRODUCT8 .
LOOP #i=1 TO 8 .
IF (BOUGHT ='' AND PRODUCT(#i)>0) BOUGHT=CONCAT('Product ',#i) .
IF (BOUGHT~='' AND PRODUCT(#i)>0) BOUGHT=CONCAT(BOUGHT,' + Product ',#i) .
END LOOP .
EXE .
要对特定产品组合应用自定义值,可以使用RECODE
。假设您需要产品组合[2,5]和[3,6,8]的自定义值。
RECODE BOUGHT
('Product 2 + Product 5' = 'Some Product Combo')
('Product 3 + Product 6 + Product 8' = 'Some Other Product Combo') .
EXE .
请记住,如果您有更多产品(和潜在组合),则希望允许BOUGHT
容纳更多字符。
答案 1 :(得分:0)
我认为,如果您将数据与vars重组为个案,则可能会找到一个更简单的解决方案。
SORT CASES BY USER_ID SHOP PRODUCT.
CASESTOVARS
/ID=USER_ID SHOP
/INDEX=PRODUCT
/GROUPBY=VARIABLE
/VIND ROOT=idx.
请记住,要执行此操作,id和shop的每个组合在您的数据集中必须唯一。
此命令后,您的数据将如下所示:
USER_ID SHOP idxPRODUCT1 idxPRODUCT2 idxPRODUCT3 idxPRODUCT4
1 1 1 1 0 0
1 2 1 0 0 1
2 1 1 0 0 0
2 2 0 1 0 0
2 3 0 0 1 0
我不确定您到底想对'bought'变量做什么。但是,假设您要创建一个字符串变量,以连接用户在商店购买的所有产品。然后您可以按照以下步骤进行操作:
STRING bought (A120).
IF (idxproduct1) bought = 'product1'.
IF (idxproduct2) bought = CONCAT(bought, ' + ', 'product2').
IF (idxproduct3) bought = CONCAT(bought, ' + ', 'product3').
IF (idxproduct4) bought = CONCAT(bought, ' + ', 'product4').
...
* Remove any leading ' + '.
IF(CHAR.INDEX(bought, ' + ') = 1) bought = REPLACE(bought, ' + ', '', 1).
EXECUTE.