Длинный или широкий массив данных с несколькими ключами и значениями - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть этот длинный, аккуратный кадр данных, который я должен сделать широким.Теперь я обычно решаю эту проблему с помощью функции tidyr::spread().Но теперь мне приходится иметь дело с несколькими ключами, значениями и соглашениями об именах.

Мой примерный фрейм данных выглядит следующим образом:

library(tidyverse)

df <- structure(list(Jaar = c(2014, 2014, 2015, 2015), Gemeente = c("Aa en Hunze", 
"Aa en Hunze", "Aa en Hunze", "Aa en Hunze"), aantal_inw = c(25286L, 
25286L, 25286L, 25286L), Categorie = c("Bedrijven", "Evenementen", 
"Bedrijven", "Evenementen"), incidenten = c(6, 13, 2, 8), per_1000inw = c(0.2, 
0.5, 0.1, 0.3)), class = c("tbl_df", "tbl", "data.frame"), .Names = c("Jaar", 
"Gemeente", "aantal_inw", "Categorie", "incidenten", "per_1000inw"
), row.names = c(NA, -4L))


# A tibble: 4 x 6
   Jaar Gemeente    aantal_inw Categorie   incidenten per_1000inw
  <dbl> <chr>            <int> <chr>            <dbl>       <dbl>
1  2014 Aa en Hunze      25286 Bedrijven            6         0.2
2  2014 Aa en Hunze      25286 Evenementen         13         0.5
3  2015 Aa en Hunze      25286 Bedrijven            2         0.1
4  2015 Aa en Hunze      25286 Evenementen          8         0.3

Я хотел бы, чтобы все эти данные были в одной строке, где Gemeente (муниципалитет) - это наблюдение.

Желаемый результат (как бы неопрятно это ни показалось ...) примерно такой:

tibble::tribble(
      ~Gemeente, ~aantal_inw, ~Bedrijven_2014_incidenten, ~Bedrijven_2015_incidenten, ~Evenementen_2014_incidenten, ~Evenementen_2015_incidenten, ~Bedrijven_2014_per_1000inw, ~Bedrijven_2015_per_1000inw, ~Evenementen_2014_per_1000inw, ~Evenementen_2015_per_1000inw,
  "Aa en Hunze",      25286L,                         6L,                         2L,                          13L,                           8L,                         0.2,                         0.1,                           0.5,                           0.3
  )

# A tibble: 1 x 10
  Gemeente    aantal_inw Bedrijven_2014_i… Bedrijven_2015_i… Evenementen_2014… Evenementen_201… Bedrijven_2014_… Bedrijven_2015_… Evenementen_201… Evenementen_201…
  <chr>            <int>             <int>             <int>             <int>            <int>            <dbl>            <dbl>            <dbl>            <dbl>
1 Aa en Hunze      25286                 6                 2                13                8              0.2              0.1              0.5              0.3

Вся помощь очень ценится.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018
untidy_df <- df %>% 
  gather(metric, value, 5:6) %>% 
  unite(combined_categories, c(Categorie, Jaar, metric)) %>% 
  spread(combined_categories, value)
0 голосов
/ 26 ноября 2018

Или используйте data.table.

library(data.table)
dt <- dcast(as.data.table(df), ... ~ Categorie + Jaar, 
            value.var=c("incidenten", "per_1000inw"))

Дает

> dt
      Gemeente aantal_inw incidenten_Bedrijven_2014 incidenten_Bedrijven_2015
1: Aa en Hunze      25286                         6                         2
   incidenten_Evenementen_2014 incidenten_Evenementen_2015
1:                          13                           8
   per_1000inw_Bedrijven_2014 per_1000inw_Bedrijven_2015
1:                        0.2                        0.1
   per_1000inw_Evenementen_2014 per_1000inw_Evenementen_2015
1:                          0.5                          0.3

Примечание: Использование df <- as.data.frame(dt) после того, как снова получить data.frame.

0 голосов
/ 26 ноября 2018
library(tidyverse)

df %>%
  gather(v1, v2, -Jaar, -Gemeente, -aantal_inw, -Categorie) %>%
  unite(v3, Categorie, Jaar, v1) %>%
  spread(v3, v2) %>%
  data.frame()

#      Gemeente aantal_inw Bedrijven_2014_incidenten Bedrijven_2014_per_1000inw Bedrijven_2015_incidenten Bedrijven_2015_per_1000inw
# 1 Aa en Hunze      25286                         6                        0.2                         2                        0.1
#   Evenementen_2014_incidenten Evenementen_2014_per_1000inw Evenementen_2015_incidenten Evenementen_2015_per_1000inw
# 1                          13                          0.5                           8                          0.3

Обратите внимание , что я использую data.frame() в конце только для целей визуализации (то есть, чтобы напечатать целые имена столбцов, чтобы вы могли проверить, все ли в порядке)

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