【问题标题】:New columns on Subgroup and Range of percentage in another column另一列中的子组和百分比范围的新列
【发布时间】:2019-02-11 11:40:22
【问题描述】:

我有一个示例 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很大,关于这个df要记住的地方:

  • 只有 2 个组“Group1”和“Group2”
  • 一个组下有多个sub_group,上面的df显示了部分子组
  • 组 + 子组的总百分比加起来为 100%。在上面它不是因为它只是一个样本。因此,对于Group1all 子组,如A, B, C 等,“Group2”将加到 100 等。 Group1Group2 的子组大致相同

问:

我需要创建一个名为Category 的列,它可以在Group.Name 级别上处理Total% 的范围。创建新列的条件是:

  • 对于每个Group.Name,无论Total% 最高,类别列就是Sub_group_name 名称。

  • 对于介于 10-30 之间的每个 Group.NameTotal%,类别列是“New_Group1”。

  • 对于每一个小于 10 的 Group.NameTotal%,类别列是“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"))

【问题讨论】:

  • Total% 在您的示例中是 factor 列。我觉得应该是numeric?
  • df_output 中的一个值在'Total' 中更改为12,即'df_test' 中的5
  • 另外,请检查“df_output”中的“类别”。根据条件,某些值应位于“New_Group1”中
  • 实际上“10”在 NewGroup2 中,因为当我说 10-30 时,我的意思是不包括 10 和 30。但是在看到解决方案之后,我知道如何切割..所以没问题

标签: r dataframe


【解决方案1】:

我们可以使用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

数据

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)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 2017-02-24
  • 2022-01-24
  • 2020-11-23
  • 2021-09-13
相关资源
最近更新 更多