R: вернуть первые «n» строк и сгруппировать оставшиеся строки в строку «Other» и суммировать столбец - PullRequest
0 голосов
/ 13 ноября 2018

Я бразилец, извините за мой английский!

Я хотел бы знать, существует ли функция, реализованная в каком-либо пакете R, для фильтрации первых «n» строк и группировки остальных в строку «Other» и суммирования столбца.

Вот пример того, что я хочу:

library(tidyverse)
library(plotly)
library(scales)  
data("lakers")

x = bind_rows(  
lakers %>% count(player) %>% arrange(-n) %>% head(10),  
lakers %>% count(player) %>% arrange(-n) %>% slice(11:n()) %>%  
summarise(player = "Others", n = sum(n))) %>%  
  filter(!player == "") %>%  
  mutate(
    player = factor(player, levels = rev(.$player)))

ggplot(x, aes(x=player, y=n))+  
  geom_col(fill = "DodgerBlue1", col = "DodgerBlue3")+  
  coord_flip()+  
  geom_text(aes(y=n, label = comma(n)),hjust = -.2)+  
  scale_y_continuous(limits = c(0, max( x$n*1.1 )))+  
  theme_minimal()

Мне нужно создать такой ggplot. Итак, у меня большой запрос с использованием dplyr, и я не хочу повторять запрос каждый раз.

Мне бы хотелось, чтобы какая-то функция была:

head.other(x, rows = 20, fun = sum, name = "Others")   

1 Ответ

0 голосов
/ 13 ноября 2018

Вот функция, которая, я думаю, даст вам то, что вам нужно:

library(tibble)
library(dplyr)

df <- data.frame(col1 = rnorm(10), col2 = rnorm(10)) # your data frame
n <- 6 # top n rows to keep

myfun <- function(df, n) {

  # seperate keep rows and those to aggregate
  preserve.df <- df[1:n, ]
  summarise.df <- df[(n+1):nrow(df), ]

  # create new df in required format
  new.df <- bind_rows(preserve.df, sapply(summarise.df, sum))

  # add a column to identify the rows and return
  rownames(new.df) <- c(paste0("r", 1:n), "Other")
  rownames_to_column(new.df)
}

myfun(df, 6)
...