首页 > 解决方案 > 将低频计数归入单个“其他”类别

问题描述

如果有一个非常简单的解决方案来解决这个问题,我们深表歉意。我是 R 和一般数据处理的新手。

我有一个包含许多因素的数据集,以及与之相关的计数。例如,

A 25
B 1
C 15
D 5
E 2

我的最终目标是使用数据框创建一个饼图。我想包括所有值,但要将低于某个计数/百分比的值分组到一个新类别或“其他”类别中。例如,如果阈值为 5:

A 25
C 15
Other 8

我可以使用该subset()函数对高于某个阈值的数据进行分组,但这只会返回我想在新表中使用的较高值,并且我无法弄清楚如何将排除的值添加到“其他”中新数据框中的类别。

如果有人可以帮助我,我将不胜感激。过去有过一两个关于这个主题的类似帖子,但不是完全相同的情况,或者对我来说很难理解。

谢谢你的时间!

数据图像:

这里

标签: rgroup-bydplyrcategories

解决方案


一种折叠factor级别的选项或character正在使用fct_collapse

library(dplyr)
library(forcats)
threshold <- 7
out <- df1 %>% 
         count(Col1 = fct_collapse(Col1, Other = unique(Col1[Col2 < threshold])),  
            wt = Col2)
out
# A tibble: 3 x 2
#  Col1      n
#  <fct> <int>
#1 A        25
#2 Other     8
#3 C        15

然后,我们可以创建一个饼图

library(ggplot2)
out %>% 
  ggplot(aes(x = "", y = n, fill = Col1)) + 
  geom_bar(width = 1, stat = "identity") + 
  coord_polar("y", start=0)

在此处输入图像描述

更新

根据 OP 的 dput,我们可以将列名更改为 OP 的列名

df2 %>%
  count(Haplogroup = fct_collapse(as.character(Haplogroup), 
      Other = unique(as.character(Haplogroup)[n < threshold])),
      wt = n, name = "n1")
# A tibble: 6 x 2
#  Haplogroup    n1
#  <fct>      <int>
#1 Other         40
#2 E1b           14
#3 N1a           12
#4 R1            10
#5 R1a           15
#6 R1b           25

或者另一个选项是base R(假设列是character类),通过比较“阈值”和“Col2”来创建一个逻辑向量,将“Col1”中“i1”为 TRUE 的元素分配给“其他”,然后进行分组通过sumaggregate

i1 <- df1$Col2 < threshold
df1$Col1[i1] <- "Other"
aggregate(Col2 ~ Col1, df1, sum)
#    Col1 Col2
#1     A   25
#2     C   15
#3 Other    8

数据

df1 <- structure(list(Col1 = c("A", "B", "C", "D", "E"), Col2 = c(25L, 
1L, 15L, 5L, 2L)), row.names = c(NA, -5L), class = "data.frame")

推荐阅读