r - 将低频计数归入单个“其他”类别
问题描述
如果有一个非常简单的解决方案来解决这个问题,我们深表歉意。我是 R 和一般数据处理的新手。
我有一个包含许多因素的数据集,以及与之相关的计数。例如,
A 25
B 1
C 15
D 5
E 2
我的最终目标是使用数据框创建一个饼图。我想包括所有值,但要将低于某个计数/百分比的值分组到一个新类别或“其他”类别中。例如,如果阈值为 5:
A 25
C 15
Other 8
我可以使用该subset()
函数对高于某个阈值的数据进行分组,但这只会返回我想在新表中使用的较高值,并且我无法弄清楚如何将排除的值添加到“其他”中新数据框中的类别。
如果有人可以帮助我,我将不胜感激。过去有过一两个关于这个主题的类似帖子,但不是完全相同的情况,或者对我来说很难理解。
谢谢你的时间!
数据图像:
解决方案
一种折叠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 的元素分配给“其他”,然后进行分组通过sum
与aggregate
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")
推荐阅读
- r - 错误/dplyr_error - 安排()在隐式变异()步骤失败
- python - 如何计算 xpath 元素
- r - 如何改变 ggarrange 中 ggplot 面板的相对宽度?
- typescript - 如何从函数参数类型中省略第一个参数?
- android - 在文本中显示数字时出现点错误
- javascript - Javascript:将返回的 JSON 对象属性转换为 PascalCase
- android - java.net.ConnectException Connection 拒绝尝试连接到 Kotlin 中的 localhost mongo DB
- vue.js - 渲染后Vue将更新的道具发送给孩子
- java - 如何替换 Maven 子模块 pom.xml 文件中的版本号?
- c - 在 C 中创建命令