Стек неправильных широкоформатных наборов данных в одном файле; сделать для очистки длинных данных в одной трубе - PullRequest
1 голос
/ 22 марта 2019

У меня есть стек широких (ish) фреймов данных, представленных в одной электронной таблице. Данные представляют собой подсчет голосов для различных политических партий в деревнях, расположенных в районах. Вот как они выглядят:

df_in <- data.frame(
  X1 = c(rep("District1", 4), rep("District2", 3)),
  X2 = c("Party", "PartyA", "PartyB", "PartyC", "Party", "PartyA", "PartyB"),
  X3 = c("Village1", "44", "12", "3", "Village3", "7", "88"),
  X4 = c("Village2", "34", "19", "2", "Village4", "90", "65"),
  X5 = c("", "", "", "", "Village5", "45", "62")
)

Я хочу сделать длинный набор данных подсчета голосов в деревне / партии, который будет выглядеть следующим образом:

df_out <- data.frame(
  district = c(rep("District1", 6), rep("District2", 6)),
  village = c(rep("Village1", 3), rep("Village2", 3), rep("Village3", 2), rep("Village4", 2), rep("Village5", 2)),
  party = c(rep(c("PartyA", "PartyB", "PartyC"), 2), rep(c("PartyA", "PartyB"), 3)),
  votes = c(44, 12, 3, 34, 19, 2, 7, 88, 90, 65, 45, 62)
)

Я ищу способ получить от df_in до df_out в одной трубе (поскольку у меня много таблиц, похожих на эту).

1 Ответ

0 голосов
/ 24 марта 2019

Решение с использованием tidyverse.

library(tidyverse)

dat <- df_in %>%
  # Split the data frame
  split(f = .$X1) %>%
  # Remove columns with all ""
  map(~select_if(.x, function(x) !all(x == ""))) %>%
  # Use the first row as the column name
  map(~set_names(.x, nm = .x %>% slice(1) %>% unlist)) %>%
  # Rename the District column
  map(~set_names(.x, nm = c("District", names(.x)[2:ncol(.x)]))) %>%
  # Remove the first row
  map(~slice(.x, 2:n())) %>%
  # Gather the data frames
  map(~gather(.x, village, votes, starts_with("Village"))) %>%
  # Combine all results
  bind_rows()
dat
#     District  Party  village votes
# 1  District1 PartyA Village1    44
# 2  District1 PartyB Village1    12
# 3  District1 PartyC Village1     3
# 4  District1 PartyA Village2    34
# 5  District1 PartyB Village2    19
# 6  District1 PartyC Village2     2
# 7  District2 PartyA Village3     7
# 8  District2 PartyB Village3    88
# 9  District2 PartyA Village4    90
# 10 District2 PartyB Village4    65
# 11 District2 PartyA Village5    45
# 12 District2 PartyB Village5    62
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...