【问题标题】:Group low frequency counts in to a single 'other' category将低频计数归入单个“其他”类别
【发布时间】:2020-05-05 09:32:53
【问题描述】:

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

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

A 25
B 1
C 15
D 5
E 2

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

A 25
C 15
Other 8

我可以使用subset() 函数对高于某个阈值的数据进行分组,但这只会返回我想在新表中使用的较高值,而且我不知道如何添加排除的值进入新数据框中的“其他”类别。

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

感谢您的宝贵时间!

数据图片:

【问题讨论】:

  • 试试i1 <- df1$Col2 < threshold; df1$Col1[i1] <- "Other"; aggregate(Col2 ~ Col1, df1, sum)(假设'Col1'是character类)
  • 感谢您的帮助。 Col1 我相信可能是一个因素?为了获取我正在使用的数据框,我获取了整洁的数据并按名称分组,然后使用 tally() 函数来获取计数。我已经尝试过您的解决方案并收到此错误消息:'In '[(*tmp*`, i1, value = c(NA, NA, 12L, NA, NA, NA, : invalid factor level, NA生成'。抱歉我的慢,我对R不是很熟悉。
  • 您可以在下面查看我的解决方案。 forcats 方法也适用于 factor
  • 如果你想让基础 R 解决方案工作 levels(df1$Col1)[levels(df1$Col1) %in% df1$Col1[i1]] <- "Other" 然后使用 aggregate

标签: r group-by dplyr categories


【解决方案1】:

折叠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类),通过比较'threshold'和'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")

【讨论】:

  • 完美运行。我无法表达我对你花时间和我一起解决这个问题的感激之情,所以非常感谢你。如果您有时间,我也很想知道代码是如何组合在一起的,以及每个部分与创建最终产品的关系。完全理解如果你现在不想这样做!
  • @RightSo 很高兴知道它有效。在forcats 代码中,我们将Haplotype 列转换为character,然后我们在count 和内部创建一个逻辑向量(n &lt; threshold)。用于对Haplotype 元素进行子集化,即如果v1 &lt;- c(1, 3, 5, 7, 9); threshold &lt;- 5; v2 v2[i1] 并在“其他”中指定unique 元素,即Other = unique(v2[i1]),而我们将wt 指定为“n”,以便获得加权计数或sum。实际上来自 v2[i1] 的值是“其他”
猜你喜欢
  • 2020-11-13
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多