Новые столбцы в подгруппе и диапазон процентов в другом столбце - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть пример df, как показано ниже:

df_test<- data.frame("Group.Name"=c("Group1","Group2","Group1","Group2","Group2","Group2","Group1"),
                "Sub_group_name"=c("A","A","B","C","D","E","C"),
                "Total%"=c(35,26,10,9,5,11,13))

Оригинальный df довольно большой, и о нем нужно помнить:

  • Есть только 2 группы "Group1"and" Group2 "
  • В одной группе несколько подгрупп, приведенный выше df показывает некоторые из подгрупп
  • Общий% для подгруппы group + составит до 100%.В приведенном выше это не так, поскольку это просто образец.Таким образом, для Group1 все подгруппы, такие как A, B, C и т. Д., Прибавят до 100 и т. Д. Для " Group2 ".Подгруппы для Group1 и Group2 будут более или менее одинаковыми

Ask:

Мне нужносоздайте столбец с именем Category, который позволяет работать в диапазоне Total% на уровне Group.Name.Условия для создания нового столбца:

  • Для каждого Group.Name, где Total% наивысший, столбец категории соответствует имени Sub_group_name.

  • Для каждых Group.Name и Total% между 10-30 столбцом категории является " New_Group1 ".

  • Для каждого Group.Name и Total% меньше 10 столбец категории имеет значение " New_Group2 ".

Ожидаемый результат:

df_output<- data.frame("Group.Name"=c("Group1","Group2","Group1","Group2","Group2","Group2","Group1"),
                     "Sub_group_name"=c("A","A","B","C","D","E","C"),
                     "Total%"=c(35,26,10,9,5,11,13),
                     "category"=c("A","A","New_Group1","New_Group1","New_Group2","New_Group1","New_Group1"))

1 Ответ

0 голосов
/ 26 сентября 2018

Мы можем сделать это с помощью cut, чтобы создать labels с соответствующим breaks, а затем заменить «Всего».это самый высокий показатель в каждом «Group.Name» с соответствующим именем «Sub_group_name»

library(dplyr)
df_test %>% 
  group_by(Group.Name) %>%
  mutate(category = as.character(cut(`Total%`, breaks = c(-Inf,10, 30, Inf), 
          labels = c("New_Group2", "New_Group1", "Other"), right = FALSE)), 
         category = case_when(`Total%` == max(`Total%`) ~ 
                          Sub_group_name,
                                   TRUE ~ category))
# A tibble: 7 x 4
# Groups:   Group.Name [2]
#  Group.Name Sub_group_name `Total%` category  
#  <chr>      <chr>             <dbl> <chr>     
#1 Group1     A                    35 A         
#2 Group2     A                    26 A         
#3 Group1     B                    10 New_Group1
#4 Group2     C                     9 New_Group2
#5 Group2     D                     5 New_Group2
#6 Group2     E                    11 New_Group1
#7 Group1     C                    13 New_Group1

data

df_test<- data.frame("Group.Name"=c("Group1","Group2","Group1","Group2","Group2",
        "Group2","Group1"),
             "Sub_group_name"=c("A","A","B","C","D","E","C"),
          "Total%"=c(35,26,10,9,5,11,13), stringsAsFactors = FALSE, 
              check.names = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...