Как маркировать значения строк (на основе условий) с помощью dplyr в R для создания новых функций - PullRequest
2 голосов
/ 02 мая 2020

Исходный набор данных аналогичен фиктивному набору данных, здесь я создал новый столбец общих продаж, основанный на сумме дневных продаж, а также отсортировал основанный на 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

Просмотр (salesdata)

Вопрос # 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. Затем мне нужно рассчитать стимул продаж "Мудрый день" (4 новых столбца, которые будут созданы для каждой пары) для каждой пары (p1, p2, p3), которая будет похожа на Incentive-Day1 (новый столбец) для «P1» - если значение продаж обоих emp id - 15 и 10 больше 5 (по отдельности), умножьте дополнительное значение продаж на 50. Таким образом, минимальный критерий равен 5 + 5 = 10, любое значение больше 10 - быть * на 50. Для P1 на Да y1 это 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      

1 Ответ

1 голос
/ 02 мая 2020

Для вашей первой проблемы

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 )

Для вашей второй проблемы - это слишком сложное для меня понимание. Но некоторые предложения:

  • Запишите свой логический стимул c как функцию, которую вы можете проверить с дискретными входами.
  • Не смешивайте значение символа «Дисквалифицированный» в столбце с числовыми значениями. Вместо этого используйте NA.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...