Сгруппируйте низкочастотные отсчеты в одну «другую» категорию - PullRequest
1 голос
/ 19 января 2020

Извините, если есть очень простое решение этой проблемы. Я новичок в R и обработке данных в целом.

У меня есть набор данных с рядом факторов и подсчетами, связанными с ними. Например,

A 25
B 1
C 15
D 5
E 2

Моя конечная цель - создать диаграмму ap ie с использованием фрейма данных. Я хочу включить все значения, но сгруппировать значения ниже определенного количества / процента в новую категорию или категорию «Другие». Например, если порог был 5:

A 25
C 15
Other 8

, я могу сгруппировать свои данные, превышающие определенный порог, с помощью функции subset(), но это возвращает только более высокие значения, которые я хочу использовать в новая таблица, и я не могу понять, как добавить исключенные значения в категорию «Другие» в новом фрейме данных.

Если кто-нибудь может мне помочь, я был бы очень признателен. В прошлом было одно или два подобных сообщения на эту тему, но все они были не совсем одинаковыми, или мне было очень трудно следить за ними.

Спасибо за ваше время!

Изображение данных:

HERE

1 Ответ

0 голосов
/ 19 января 2020

Один из вариантов, чтобы свернуть уровни 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

, тогда мы можем создать график * ie

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

enter image description here

Обновление

Исходя из dput для OP, мы можем изменить имена столбцов на имена столбцов 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, для «Other» ', затем сделайте группу 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

Data

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")
...