Объединение данных под разными уровнями факторов при сохранении исходных уровней - PullRequest
0 голосов
/ 12 февраля 2019

Я бы хотел найти решение для следующей задачи.В моем наборе данных у меня есть данные о различных уровнях факторов.Я хотел бы создать новый уровень фактора «Итого», который будет суммой всех значений Y на существующих уровнях фактора X. Это можно сделать, например, с помощью:

mutate(Data, X = fct_collapse(X, Total = c("A", "B", "C", "D"))) %>%
  group_by(X) %>% 
  summarize(Y = sum(Y))

Однако это такжеобязательно перезаписывает исходные уровни факторов.Мне потребуется объединить исходный набор данных с новым свернутым набором данных на дополнительном шаге.

Одно из решений, которое я использовал в прошлом для сохранения исходных уровней, - это перенести данные в широкий формат и перейти к * 1006.* и mutate() для создания новой переменной с «Total», а затем для изменения ее формы на long.

spread(Data, key = X, value = Y) %>%
  rowwise() %>%
  mutate(Total = sum(A, B, C, D)) %>%
  gather(1:5, key = "X", value = "Y")

Однако я очень недоволен этим решением, поскольку использование rowwise() не считается хорошей практикой,Было бы здорово, если бы вы указали мне на доступное альтернативное решение, как объединять данные с различными уровнями факторов, сохраняя при этом исходные уровни.

Минимальный воспроизводимый пример:

Data<-data.frame(
X = factor(c("A", "B", "C", "D")),
Y = c(1000, 2000, 3000, 4000))

Ожидаемый результат:

# A tibble: 5 x 2
  X         Y
  <chr> <dbl>
1 A      1000
2 B      2000
3 C      3000
4 D      4000
5 Total 10000

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Примечание : хотя мой ответ не отвечает всем потребностям ОП, я решил опубликовать более простой ответ, если кто-то не заботится о сохранении факторов, это не плохая идея,

Используя библиотеку , это будет очень просто.

Data %>% janitor::adorn_totals("row") %>% mutate(X=factor(X))

  # X     Y
  # A     1000
  # B     2000
  # C     3000
  # D     4000
  # Total 10000

Просмотр структуры вывода:

str(output)

# 'data.frame': 5 obs. of  2 variables:
#  $ X: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
#  $ Y: num  1000 2000 3000 4000 10000
0 голосов
/ 12 февраля 2019

Используя предложение в первой версии @ MM его комментария к отредактированному вопросу, я добавил bind_rows.
Я также немного изменил набор входных данных.После комментария OP и @ camille этот набор данных имеет факторный уровень "Z", но сохраняет первоначальный порядок и добавляет уровень "Total" в конце.

Data <- data.frame(
  X = factor(c("A", "B", "C", "Z")),
  Y = c(1000, 2000, 3000, 4000))

Data %>%
  mutate(lvl = levels(X),
         X = fct_collapse(X, Total = c("A", "B", "C", "Z")),
         X = as.character(X)) %>%
  bind_rows(mutate(Data, X = as.character(X)), .) %>%
  mutate(X = factor(X, levels = c(lvl, "Total"))) %>%
  group_by(X) %>% 
  summarize(Y = sum(Y)) -> d

d
## A tibble: 5 x 2
#  X         Y
#  <fct> <dbl>
#1 A      1000
#2 B      2000
#3 C      3000
#4 Z      4000
#5 Total 10000

Проверьте выводуровни факторов.

levels(d$X)
#[1] "A"     "B"     "C"     "Z"     "Total"
...