Изменение формы данных с несколькими строками заголовка в R - PullRequest
2 голосов
/ 07 июня 2019
                Julie                           Joe                
                Measurement 1   Measurement 2   Measurement 1   Measurement 2
Part Number 1   33              32              33              31
Part Number 2   34              31              33              32
Part Number 3   33              31              30              31

Как мне получить эту грязную таблицу Excel в аккуратном формате для использования в R? Я могу использовать функции readr, такие как spread() и gather(), но для этого требуется более высокий уровень сложности. Вот моя лучшая реконструкция фрейма данных Excel, с которой можно возиться. Пожалуйста, измените его по своему желанию, чтобы лучше разобраться.

library(tidyverse)
messy <- data.frame(
  " " = c(" ", "Part Number 1", "Part Number 2", "Part Number 3"), 
  Julie = c("Measurement 1", 33, 34, 33),
  Julie = c("Measurement 2", 32, 31, 31),
  Joe = c("Measurement 1", 33, 33, 30),
  Joe = c("Measurement 2", 31, 32, 31))

Я открыт для попытки разработки версий readr или tidyr. Новые функции pack(), unpack() и т. Д. Кажутся полезными. Кроме того, кажется, что другие попытки / решения SO не совсем то, что я ищу 1 , 2 , 3 , 4 .

1 Ответ

2 голосов
/ 07 июня 2019

Сложная задача - получить правильные имена столбцов, а затем выполнить gather и separate, что, похоже, уже знакомо. Обычно я не люблю выбирать строки по номерам, но в этом случае я думаю, что имеет смысл, если вы так надежно читаете данные из Excel.

примечание: если имя человека содержит ., последний шаг завершится неудачей.

library(tidyverse)

less_messy <- messy %>%
  mutate_all(as.character) %>% 
  set_names(c("Part",
             paste(names(.)[2:ncol(.)],
                   .[1, 2:ncol(.)],
                   sep = "-"))) %>%
  `[`(2:nrow(.), ) %>%
  gather("key", "value", contains("Measurement")) %>%
  separate("key", c("person", "measurement"), sep = "-") %>%
  mutate_at("person", ~ stringr::str_replace(.x, "\\..*",""))

less_messy
#>             Part person   measurement value
#> 1  Part Number 1  Julie Measurement 1    33
#> 2  Part Number 2  Julie Measurement 1    34
#> 3  Part Number 3  Julie Measurement 1    33
#> 4  Part Number 1  Julie Measurement 2    32
#> 5  Part Number 2  Julie Measurement 2    31
#> 6  Part Number 3  Julie Measurement 2    31
#> 7  Part Number 1    Joe Measurement 1    33
#> 8  Part Number 2    Joe Measurement 1    33
#> 9  Part Number 3    Joe Measurement 1    30
#> 10 Part Number 1    Joe Measurement 2    31
#> 11 Part Number 2    Joe Measurement 2    32
#> 12 Part Number 3    Joe Measurement 2    31

данные

изменилось незначительно, потому что я заметил несоответствие между тем, что вы показали, и вашим кодом для номеров измерений:

messy <- data.frame(
  " " = c(" ", "Part Number 1", "Part Number 2", "Part Number 3"), 
  Julie = c("Measurement 1", 33, 34, 33),
  Julie = c("Measurement 2", 32, 31, 31),
  Joe = c("Measurement 1", 33, 33, 30),
  Joe = c("Measurement 2", 31, 32, 31))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...