Как суммировать конкретные строки в кадре данных, используя R? - PullRequest
2 голосов
/ 24 апреля 2019

Я работаю над исследовательской работой, и у меня есть дата-фрейм, который включает в себя некоторые отделы и их бюджеты за определенный период времени. Давайте возьмем следующий кадр данных в качестве примера.

df
departments   budget
  <chr>       <dbl>
 test1        100
 test2        200
 test3        300

В моем случае «test1» и «test3» - это два разных выражения, которые на самом деле относятся к одному и тому же отделу. Поэтому мне нужно сложить свои бюджеты.

Вот результат, который я ожидаю

df
departments   budget
  <chr>       <dbl>
 test1        400
 test2        200

Ответы [ 2 ]

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

Для очень маленького примера, когда только 2 значения свернуты в 1, что-то вроде ifelse вполне подойдет. Но он не масштабируется больше, чем одна операция, сворачивающая одну пару значений - вы застрянете во множестве вложенных операторов ifelse или, возможно, case_when. Я часто выполняю эти операции и рекомендую преобразовать вашу переменную в коэффициент, чтобы вы могли более легко и гибко манипулировать уровнями. forcats::fct_collapse делает это хорошо, а forcats::fct_other работает в особых ситуациях.

Для небольшого примера это может показаться большим трудом, чем стоит:

library(dplyr)

df <- tribble(
  ~departments, ~budget,
  "test1",      100,
  "test2",      200,
  "test3",      300
)

df %>%
  mutate(departments = as.factor(departments) %>%
           forcats::fct_collapse(test1 = c("test1", "test3"))) %>%
  group_by(departments) %>%
  summarise(budget = sum(budget))
#> # A tibble: 2 x 2
#>   departments budget
#>   <fct>        <dbl>
#> 1 test1          400
#> 2 test2          200

Но если я добавлю больше отделов и мне потребуется выполнить несколько таких операций, это масштабируется. Здесь мне нужно свернуть 3 уровня в 1, а затем еще 2 в другой 1.

df2 <- tribble(
  ~departments, ~budget,
  "test1",      100,
  "test2",      200,
  "test3",      300,
  "test4",      400,
  "test5",      500
)

df2 %>%
  mutate(departments = as.factor(departments) %>%
           forcats::fct_collapse(test1 = c("test1", "test3", "test4"),
                                 test2 = c("test2", "test5"))) %>%
  group_by(departments) %>%
  summarise(budget = sum(budget))
#> # A tibble: 2 x 2
#>   departments budget
#>   <fct>        <dbl>
#> 1 test1          800
#> 2 test2          700
1 голос
/ 24 апреля 2019

Нет необходимости использовать идентификаторы.Если ваша цель - объединить каждый test3 с test1 и получить сумму бюджета этого объединения, вы можете использовать dplyr функции, подобные этой:

library(dplyr)

df %>%
  mutate(departments, departments = ifelse(departments=="test3", "test1", departments)) %>%
  group_by(departments) %>% 
  count(departments, wt=budget) -> df

Приведенный выше код даст вам результат, который вы ищетедля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...