繁体   English   中英

从字符串中减去数据

[英]subtract data from a string

对不起,我的英语不好。 我有一个促销活动表,如下所示:

promotion_campaign <- data.table(product = letters[1:3],description = c('30-5,40-7,50-9','20-5,30-6,40-8','20-4,30-5,50-8'),tagged_price = c(30,21,52))

“说明”表示,如果tagd_price高于“-”之前的第一个数字(或等于数字),则应减去“-”之后的数字。 例如,产品a的agged_price = 30,实际价格= 30-5 =25。广告系列与每个产品都不同。 结果表应该是这样的:

promotion_campaign <- data.table(product = letters[1:3],description = c('30-5,40-7,50-9','20-5,30-6,40-8','20-4,30-5,50-8'),tagged_price = c(30,20,52),actual_price = c(25,15,44))

要获得'actual_price',需要进行字符串拆分,将标记的价格查找到正确的类别,然后减去折扣,有人可以启发我吗?

tidyverse (特别是dplyrtidyr )解决方案。 希望这是可以理解的。 无论如何,很容易一行一行地执行它以查看每个步骤会发生什么。

library(tidyverse)
promotion_campaign %>% 
    mutate(description = strsplit(description, ",")) %>% 
    unnest(description) %>% 
    separate(description, c("price_point", "discount"), "-", convert = T) %>% 
    filter(tagged_price >= price_point) %>% 
    arrange(product, -price_point) %>% 
    group_by(product) %>%
    slice(1) %>% 
    mutate(actual_price = tagged_price - discount)

我们可以试试

i1 <- as.integer(sub("-.*", "", promotion_campaign$description)) < 
                  promotion_campaign$tagged_price
m1 <- do.call(rbind, lapply(strsplit(promotion_campaign$description, 
                     '[-,]'), function(x) as.numeric(x)[c(2, 6)]))
promotion_campaign$actual_price <-  ifelse(i1, promotion_campaign$tagged_price - m1[,2], 
               promotion_campaign$tagged_price - m1[,1])

此答案使用dplyrtidyr ,而不是data.table ,并且如果您有不同数量的折扣,则很难轻易推广,但这确实回答了您的问题。

library(dplyr)
library(tidyr)
promotion_campaign <- data.frame(product = letters[1:3],description = c('30-5,40-7,50-9','20-5,30-6,40-8','20-4,30-5,50-8'),tagged_price = c(30,21,52))

promotion_campaign2 <- promotion_campaign %>% 
  separate(description,
           c("cut1", "discount1", "cut2", "discount2", "cut3", "discount3"),
           convert = TRUE) %>% 
  mutate(actual_price = ifelse(tagged_price >= cut1, tagged_price - discount1,
                               ifelse(tagged_price >= cut2, tagged_price - discount2,
                                      ifelse(tagged_price >= cut3, tagged_price - discount3,
                                             tagged_price))))

> promotion_campaign2
  product cut1 discount1 cut2 discount2 cut3 discount3 tagged_price actual_price
1       a   30         5   40         7   50         9           30           25
2       b   20         5   30         6   40         8           21           16
3       c   20         4   30         5   50         8           52           48

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM