Суммируйте с помощью dplyr - одна переменная всегда внизу - PullRequest
2 голосов
/ 24 апреля 2019

Может кто-нибудь помочь мне с этим? Я сгруппировал и суммировал данные о расходах от нескольких компаний, результат выглядит так:

df <- data.frame(
    Column1 = c("Other", "Brand1", "Brand2", "Brand3", "Brand4", "Brand5"),
    Column2 = c(NA, "Subbrand1", "Subbrand2", "Subbrand3", "Subbrand4", "Subbrand5"),
    Spendings = c(1000, 500, 250, 200, 150, 100)
)

  Column1   Column2 Spendings
1   Other      <NA>      1000
2  Brand1 Subbrand1       500
3  Brand2 Subbrand2       250
4  Brand3 Subbrand3       200
5  Brand4 Subbrand4       150
6  Brand5 Subbrand5       100

Строка "others" находится сверху, однако я хочу, чтобы этот конкретный столбец был внизу из-за более поздней визуализации (как здесь)

df <- data.frame(
    Column1 = c("Brand1", "Brand2", "Brand3", "Brand4", "Brand5", "Other"),
    Column2 = c("Subbrand1", "Subbrand2", "Subbrand3", "Subbrand4", "Subbrand5", NA),
    Spendings = c(500, 250, 200, 150, 100, 1000)
)

  Column1   Column2 Spendings
1  Brand1 Subbrand1       500
2  Brand2 Subbrand2       250
3  Brand3 Subbrand3       200
4  Brand4 Subbrand4       150
5  Brand5 Subbrand5       100
6   Other      <NA>      1000

Это функция, которую я использовал для создания df с каким-то желаемым моим кодом, который обв. не работает: - (.

df <- df%>%
    group_by(Column1, Column2) %>%
    summarise(Spendings = sum(Spendings)) %>%
    arrange(desc(Spendings), lastrow = "others")

Есть ли способ получить строку "другие" внизу внутри рабочего процесса dplyr? Подмножество и rbinding, конечно, возможны, но есть ли способ, который подходит лучше?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Мы можем использовать логический вектор на arrange, и это приведет к упорядочению в алфавитном порядке, т.е. FALSE предшествует TRUE

df %>% 
   arrange(Column1 == "Other")
#  Column1   Column2 Spendings
#1  Brand1 Subbrand1       500
#2  Brand2 Subbrand2       250
#3  Brand3 Subbrand3       200
#4  Brand4 Subbrand4       150
#5  Brand5 Subbrand5       100
#6   Other      <NA>      1000

Другой вариант - создатьстолбец как factor с levels, указанным в этом порядке, так что «Другое» является последним level, и если мы arrange, это будет сделано в порядке, основанном на levels.Это может быть лучшим вариантом, так как он также будет поддерживаться при выполнении plot

un1 <- c(setdiff(unique(df$Column1), "Other"), "Other")
df %>%
    mutate(Column1 = factor(Column1, levels = un1)) %>%
    arrange(Column1)

, если мы используем пакет forcats, есть несколько полезных функций fct_relevel для измененияlevels легко

library(forcats)
df %>% 
  mutate(Column1 = fct_relevel(Column1, "Other", after = Inf)) %>% 
  arrange(Column1)

В соответствии с примерами в ?fct_relevel

Использование «Inf» позволяет выполнять возврат к концу, когда количество уровней неизвестно или является переменным(например, векторизованные операции)

0 голосов
/ 24 апреля 2019
df <- df%>%
group_by(Column1, Column2) %>%
summarise(Spendings = sum(Spendings)) %>%
arrange(Column1=="Other", desc(Spendings))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...