【问题标题】:How to Label rows values (condition based) using dplyr in R to create new features如何在 R 中使用 dplyr 标记行值(基于条件)以创建新功能
【发布时间】:2020-08-16 23:43:53
【问题描述】:

原始数据集类似于虚拟数据集,这里我根据日销售额总和创建了一个新列总销售额,并且我已经对总销售额的df基础降序排序

library(dplyr)

empid <- c(10,11,12,13,14,15)  # Employee id
city <- c("Goa","Goa","Goa","Goa","Goa","Goa")  # City
Day1 <- c(5,15,5,9,2,9)  # Sales made on Day 1 and so on...
Day2 <- c(5,3,8,5,10,7)
Day3 <- c(3,9,6,4,8,10)
Day4 <- c(7,6,8,8,2,8)

salesdata <- data.frame(empid,city,Day1,Day2,Day3,Day4)
#str(salesdata)


salesdata<- salesdata %>% mutate(Total_Sales = rowSums(.[3:6])) ## New Column creation Total sales

salesdata <- salesdata[order(-salesdata$Total_Sales),] ## Sorting df - salesdata, basis total sales value in descending order

查看(销售数据)

问题#1 我需要将 emp id 分成两对(总共 3 对)基于从前到后的方法(根据总销售额,从最高到最低,然后依此类推),它应该看起来类似于下面的块这样“可以通过在每对上使用 group_by(Pair_number) 来执行新的一组操作(问题 2)。

在输出中期望这个

   empid city  Day1 Day2 Day3  Day4 Total_Sales Pair_number                 
    15   Goa    9   7    10    8        34           P1
    10   Goa    5   5    3     7        20           P1
    11   Goa    15  3    9     6        33           P2
    14   Goa    2   10   8     2        22           P2
    12   Goa    5   8    6     8        27           P3
    13   Goa    9   5    4     8        26           P3

问题#2。然后我需要在每对(p1,p2,p3)上计算销售激励“Day wise”(为每对创建 4 个新列),这就像“P1”的 Incentive-Day1(新列) - 如果emp id - 15 和 10 的销售额均大于 5(单独),然后将额外的销售额乘以 50。因此,最小标准为 5+5=10,任何大于 10 的值都是 * 乘以 50。对于第 1 天的 P1 是 9+5 = 14,额外销售价值为 4,因此第 1 天/第 1 对的激励价值为 200,否则该对将被取消当天的激励资格。

预期输出

empid city  Day1 Day2 Day3  Day4 Total_Sales Pair_number  Incent-Day1  Incent-Day2   Incent-Day3       
    15   Goa    9   7    10    8        34           P1        200        100         Disqualified
    10   Goa    5   5    3     7        20           P1
    11   Goa    15  3    9     6        33           P2    Disqualified Disqualified     350
    14   Goa    2   10   8     2        22           P2
    12   Goa    5   8    6     8        27           P3       200          150         Disqualified      
    13   Goa    9   5    4     8        26           P3      

【问题讨论】:

    标签: r dplyr data-manipulation feature-engineering labeling


    【解决方案1】:

    第一个问题

    library(tidyverse)
    salesdata <- tibble(empid,city,Day1,Day2,Day3,Day4) %>% 
      mutate(Total_Sales = rowSums(.[3:6])) %>% 
      arrange(desc(Total_Sales)) %>% 
      rowid_to_column("Pair_number") %>% 
      mutate(Pair_number = paste0("P", floor((Pair_number + 1) / 2 ))) %>% 
      select(empid, city,  Day1, Day2, Day3,  Day4, Total_Sales, Pair_number )
    

    对于您的第二个问题 - 条件太复杂了,我无法理解。但一些建议:

    • 将您的激励逻辑编写为一个函数,您可以使用离散输入对其进行测试。
    • 不要将列中的“不合格”字符值与数值混合。请改用NA

    【讨论】:

    • 对您的代码稍作更改将按最高和最低总销售额对 ID 进行配对:salesdata % mutate(Total_Sales = rowSums (.[3:6])) %>% 排列(desc(Total_Sales)) %>% rowid_to_column("Pair_number") %>% mutate(Pair_number = paste0("P", c(1:(nrow(salesdata)) /2), (nrow(salesdata)/2):1))) %>% select(empid, city, Day1, Day2, Day3, Day4, Total_Sales, Pair_number ) %>% 安排(Pair_number)
    • @David T,感谢您回答这个问题,很抱歉回复晚了,这种情况会在我的原始数据集中真正杀死我。将单独发布。
    猜你喜欢
    • 1970-01-01
    • 2019-11-29
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多