重命名分类级别以减少级别数量

问题描述 投票:0回答:2

我有一个分类列,该列在大约78000条记录的数据集中具有大约1200个级别。我想根据发生次数降低水平。例如。 -:

  • 发生超过2000次的所有级别都重命名为'A'。
  • 发生的所有级别大于1000次但小于2000次重命名为“ B”
  • 发生的所有级别大于900次但小于1000次重命名为“ C”

依此类推。

我不想将不常出现的关卡归类为“其他”,因为这会隐藏很多重要的关卡。例如,下面是数据框。

df=data.frame(
  ID = c(1:10),
  Name = c("Jack", "Mike","Jack", "Mike","Jack", "Mike", "Tom", "Tom", "Smith", "Tony")
)

在这里,我想将“名称”列的级别减少-:

  • 将出现的所有级别重命名为A的次数大于等于3次
  • 重命名发生的所有级别> = 2,但<3倍为'B'
  • 将<2次出现的所有级别重命名为'C'

有人可以帮助我在R中做到这一点吗?

r
2个回答
0
投票

我们可以使用add_count来计数Name的实例,然后使用case_when检查条件

library(dplyr)

df %>% 
  add_count(Name) %>%
  mutate(NewName = case_when(n >= 3 ~'A', 
                             n >= 2 & n < 3 ~'B', 
                             TRUE ~'C')) %>%
  select(-n, -Name)

#     ID NewName
#   <int> <chr>  
# 1     1 A      
# 2     2 A      
# 3     3 A      
# 4     4 A      
# 5     5 A      
# 6     6 A      
# 7     7 B      
# 8     8 B      
# 9     9 C      
#10    10 C      

0
投票

使用table的基本R解决方案

NameCount = table(df$Name)[df$Name]
NewName = rep("C", length(NameCount))
NewName[NameCount >= 2] = "B"
NewName[NameCount >= 3] = "A"
NewName
 [1] "A" "A" "A" "A" "A" "A" "B" "B" "C" "C"
© www.soinside.com 2019 - 2024. All rights reserved.