如何在R中使用dplyr标记行值(基于条件)以创建新的功能。

问题描述 投票:1回答:1

原始数据集与虚拟数据集类似,这里我根据当日销售总额新建了一列销售总额,同时我还根据销售总额的降序进行了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对)从先到后的方式(在总销售额上,先从最高到最低,然后依次类推)进行分组,它应该类似于下面的块,这样 "新的一组操作(Ques- 2)可以通过在每对上使用group_by(Pair_number)来执行。

希望输出的结果是这样的

   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)计算 "日 "的销售激励(为每对建立4个新的列)。那么我需要计算每对(p1,p2,p3)的 "日 "销售奖励(为每对建立4个新列),就像 "P1 "的Incentive-Day1(新列)-如果两个emp id-15 & 10的销售值大于5(单独),那么将额外的销售值乘以50.所以最小标准是5+5=10,大于10的值要*乘以50. 所以最小标准是5+5=10,任何大于10的值都要*乘以50。对于P1来说,第1天的数值是9+5=14,额外的销售值是4,所以Day1Pair1的激励值加起来是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个回答
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 )

但我有一些建议。

  • 把你的激励逻辑写成一个函数,你可以用离散输入来测试。
  • 不要把 "Disqualified "字符值和数字值混在一列中。 使用 NA 而不是。
© www.soinside.com 2019 - 2024. All rights reserved.