Создание новой переменной со сводными значениями на основе группы - PullRequest
0 голосов
/ 15 июня 2019

У меня действительно есть два вопроса.Я совершенно уверен, что второй поможет мне решить первый, но я могу быть на неправильном пути, и могут быть более простые решения.

Первый вопрос: я хотел бы составить гистограмму с накоплениемиспользуя ggplot2 и geom_bar.У меня есть данные временных рядов по многим странам с 4 дискретными интервалами (годами).Я знаю, что нетипично показывать данные временных рядов в виде гистограмм (и я открыт для альтернативных предложений).То, что я пытаюсь сделать, это показать гистограммы в виде фазовых диаграмм (по годам), где страны показаны в одинаковом порядке убывания на основе суммы всех моих 4 переменных за все 4 года.Я хотел бы показать только первые 25 стран.

Чтобы сделать все это, я использовал комбинацию труб dplyr и ggplot.

Сначала я вычислил новый столбец с помощью

 data %>% 
  rowwise() %>% 
  mutate(total = sum(var1, var2, var3, var4, na.rm = T) %>% 
  arrange(desc(total)) %>% 
  top_n(100, total) %>% 
  ggplot...

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

Затем я попытался использовать функцию суммирования для суммирования 4-х переменных за все 4 года следующим образом:

 data %>% 
  summarize(sum = sum(var1, var2, var3, var4, na.rm = T))

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

Я постараюсь воспроизвести оба эти вопроса здесь:

Некоторые данные:

 countries <- c("country A", "country B", "country C", "country D", "country E")
  years <- rep(c(2014, 2015, 2016, 2017), 5)
  set.seed(123)
  var1 <- sample(1:1000, 20)
  var2 <- sample(1:1000, 20)
  var3 <- sample(1:1000, 20)
  var4 <- sample(1:1000, 20)
  data <- data.frame(countries, years, var1, var2, var3, var4)

  data %>% 
   rowwise() %>% 
   mutate(total = sum(var1, var2, var3, var4, na.rm = T)) %>% 
   gather(key, value, 3:6) %>% 
   top_n(32, total) %>% 
    ggplot(., aes(x = countries, y = value, fill = key)) + 
     geom_col() + 
     facet_grid(cols = vars(years)) + 
     coord_flip()

Undesired Output

Как вы можете видеть, и, как и ожидалось по коду, R вычислил сумму каждой пары страна-год, ачем сумма для каждой страны для ВСЕХгода.Я серьезно потерян на том, как действовать.Любая помощь приветствуется!

Если это имеет какое-либо значение: множество NA в Var3 и Var4.

Я забыл проиллюстрировать второй вопрос:

  data %>% 
   group_by(countries) %>% 
   summarize(sum = sum(var1, var2, var3, var4, na.rm = T))

возвращает aтаблица со странами и суммами, но как мне переназначить этот новый столбец в мой исходный фрейм данных?

1 Ответ

0 голосов
/ 16 июня 2019

После r2evans это решило проблему для меня:

Сначала я суммировал все значения и сохранил это в новый набор данных

data2 <- data %>% 
 group_by(countries) %>% 
 summarize(sum = sum(var1, var2, var3, var4, na.rm = T))

Затем я left_join отредактировал дванаборы данных как таковые

 left_join(data, data2)

Я мог бы указать by = countries, но мне не пришлось этого делать, потому что это была единственная общая переменная в обоих наборах данных.

Хотя это решило проблемуи я всегда благодарен r2evans, мне все еще интересно одношаговое решение.Пожалуйста, прокомментируйте, если у вас есть.

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