基于R中的字符串交集创建数字变量

时间:2019-01-22 01:53:05

标签: r string

我正在尝试根据字符串与R的dplyr包的交集创建一个数字变量。
我有一个列列表,其中包含用于在汽车经销商购物的数千个人的代码。该代码可以表示购买汽车,汽车内部零件或汽车外部物品。我想表示标识为2的购车代码,其中1表示汽车内部的项目,0表示汽车外部的项目。如果客户购买了汽车,则我希望列LargestPurchase = 2;如果客户不是买车而是买了内饰,那么我希望LargestPurchase = 1列;如果客户不购买汽车或内饰部件,我希望列LargestPurchase = 0。

购买汽车的代码位于带有CarCodes列的单独的数据框中,而汽车内部组件的代码位于带有InternalCodes列的单独的数据框中。每个都包含数千个代码。

用于客户的数据如下所示(称为客户):

Customer1     PurchaseCode1    PurchaseCode2    PurchaseCode3
001           STW387           K987             W9333
002           AZ326            CP993            EN499
003           BKY98            A0091            C2001

示例:

df1$CarCodes = c('STW387', 'W9333')
df2$InteriorCodes = c('K987', 'AZ326')

Customer1     PurchaseCode1    PurchaseCode2    PurchaseCode3   LargestPurchase 
001           STW387           K987             W9333           2
002           AZ326            CP993            EN499           1
003           BKY98            A0091            C2001           0

我尝试将以下ifelse函数与mutate一起使用,但似乎不适用于字符串:

      customers <- customers %>% mutate(LargestPurchase = 
    (ifelse(intersect(customers$PurchaseCode1, df1$CarCodes) == TRUE | 
intersect(customers$PurchaseCode2, df1$CarCodes) | 
intersect(customers$PurchaseCode3, df1$CarCodes), 2, ifelse( 
intersect(customers$PurchaseCode1, df2$InteriorCodes) == TRUE | 
intersect(customers$PurchaseCode2, df2$InteriorCodes) == TRUE |
intersect(customers$PurchaseCode3, df3$InteriorCodes) == TRUE, 1, 0)))

任何见识都会很棒。

2 个答案:

答案 0 :(得分:2)

这是dplyr

CarCodes = c('STW387', 'W9333')
InteriorCodes = c('K987', 'AZ326')

data.frame(customer = c(001, 002, 003),
           code1 = c('STW387', 'AZ326', 'BKY98'),
           code2 = c('K987', 'CP993', 'A0091'),
           code3 = c('W9333', 'EN499', 'C2001')) %>% 
  gather(variable, value, -customer) %>% 
  mutate(purchase = case_when(value %in% CarCodes ~ 2,
                              value %in% InteriorCodes ~ 1,
                              TRUE ~ 0)) %>% 
  group_by(customer) %>% 
  summarise(largest_purchase = max(purchase))

答案 1 :(得分:1)

确定是否包含CarCodesInteriorCodes,然后使用最大值。

c2 <- apply(df3[,-1], 1, function(x) ifelse(any(x %in% df2$InteriorCodes), 1, 0))
c1 <- apply(df3[,-1], 1, function(x) ifelse(any(x %in% df1$CarCodes), 2, 0))
df3$LargestPurchase <- pmax(c1, c2)

  Customer1 PurchaseCode1 PurchaseCode2 PurchaseCode3 LargestPurchase
1         1        STW387          K987         W9333               2
2         2         AZ326         CP993         EN499               1
3         3         BKY98         A0091         C2001               0