我正在尝试根据字符串与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)))
任何见识都会很棒。
答案 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)
确定是否包含CarCodes
或InteriorCodes
,然后使用最大值。
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