Агрегирование данных в кадре данных путем первого преобразования значений в столбце - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть набор данных с номерами импорта и экспорта из стран, который выглядит в основном так:

Country_from   Country_to    Count    Value
   UK             USA          5        10
   France         Belgium      4        7
   USA            UK           1        6
   Belgium        France       8        9

Теперь я хочу объединить эти данные и объединить числа импорта и экспорта суммированием.Итак, я хочу, чтобы мой результирующий кадр данных был:

 Country_from   Country_to    Count    Value
   UK             USA          6        16
   France         Belgium      12       16

Я создал скрипт, который объединяет страны to и from, а затем сортирует символы по алфавиту, чтобы проверить, например, Великобритания - СШАи США-Великобритания совпадают, а затем агрегируют значения.

Эта часть моего кода для сортировки выглядит следующим образом:

#concatenate to and from country name
country_from = data.frame(lapply(data_lines$Country_from, as.character), stringsAsFactors=FALSE)
country_to = data.frame(lapply(data_lines$Country_to, as.character), stringsAsFactors=FALSE)
concat_names = as.matrix(paste(country_from, country_to, " "))

#order characters alphabetically
strSort <- function(x)
 sapply(lapply(strsplit(x, NULL), sort), paste, collapse="")

sorted = strSort(concat_names)

Этот подход работает в данном конкретном случае, но можеттеоретически может быть так, что две разные страны имеют одинаковые алфавитно отсортированные символы.

Если существует комбинация Country_from - Country_to без того же обратного, то она должна сохранять значения по мере их поступления (поэтому ничего не делать).

У кого-нибудь есть идея?как это сделать без использования отсортированных по алфавиту символов?

1 Ответ

0 голосов
/ 03 декабря 2018

Одним из способов использования dplyr было бы создание группирующей переменной rowwise путем сортировки и вставки Country_from и Country_to, а затем взятия sum этой группой.

library(dplyr)

df %>%
  rowwise() %>%
  mutate(country = paste(sort(c(Country_from, Country_to)), collapse = "-")) %>%
  ungroup() %>%
  group_by(country) %>%
  summarise_at(vars(Count:Value), funs(sum))

#   country        Count Value
#  <chr>          <int> <int>
#1 Belgium-France    12    16
#2 UK-USA             6    16

Здесьвместо сортировки символов мы сортируем слова.

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