我有一个分类列,该列在大约78000条记录的数据集中具有大约1200个级别。我想根据发生次数降低水平。例如。 -:
依此类推。
我不想将不常出现的关卡归类为“其他”,因为这会隐藏很多重要的关卡。例如,下面是数据框。
df=data.frame(
ID = c(1:10),
Name = c("Jack", "Mike","Jack", "Mike","Jack", "Mike", "Tom", "Tom", "Smith", "Tony")
)
在这里,我想将“名称”列的级别减少-:
有人可以帮助我在R中做到这一点吗?
我们可以使用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
使用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"