【问题标题】:Concatenation of user products based in conditions基于条件的用户产品串联
【发布时间】:2018-08-19 15:00:29
【问题描述】:

我试图在某些条件下连接字符串变量。假设以下数据来说明。

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_IDSHOP 创建一个名为BOUGHT 的新变量,其中包含产品名称,遵循一些规则。

对于相同的USER_IDSHOP

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_IDSHOP 购买的产品。然后创建变量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 条件将需要大量工作。我怎么能这样做?

【问题讨论】:

  • 到目前为止,您的语法有一些改进(例如,您应该查找do repeat),但我无法真正理解您想要实现的目标。获取像“PRODUCT1 + PRODUCT4”这样的文本应该很容易,但您需要更好地解释“PRODUCT MIX”的规则是什么

标签: spss


【解决方案1】:

我认为在您有条件的情况下,您可能需要在某种程度上使用IF。在不知道您需要适应的特定“产品”组合的情况下,我将尽我所能提供一种通用方法。

假设您有 8 种产品。我们将像您一样将它们聚合到 USER_ID by 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_IDSHOP 可能出现的所有产品组合。

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 容纳更多字符。

【讨论】:

    【解决方案2】:

    我认为,如果您使用 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
    

    我不确定您到底想对“购买”变量做什么。但是,假设您要创建一个字符串变量来连接用户在商店中购买的所有产品。然后你可以这样做:

    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.
    

    【讨论】:

      猜你喜欢
      • 2017-03-09
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2021-05-19
      相关资源
      最近更新 更多