Сложная задача - получить правильные имена столбцов, а затем выполнить 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))