Конвертировать несколько таблиц заголовков в длинный формат - PullRequest
0 голосов
/ 12 октября 2018

Я читаю в таблице Excel с несколькими строками заголовков, которая через read.csv создает такой объект в R .

R1 <- c("X", "X.1", "X.2", "X.3", "EU", "EU.1", "EU.2", "US", "US.1", "US.2")
R2 <- c("Min Age", "Max Age", "Min Duration", "Max Duration", "1", "2", "3", "1", "2", "3")
R3 <- c("18", "21", "1", "3", "0.12", "0.32", "0.67", "0.80", "0.90", "1.01")
R4 <- c("22", "25", "1", "3", "0.20", "0.40", "0.70", "0.85", "0.98", "1.05")
R5 <- c("26", "30", "1", "3", "0.25", "0.50", "0.80", "0.90", "1.05", "1.21")
R6 <- c("18", "21", "4", "5", "0.32", "0.60", "0.95", "0.99", "1.30", "1.40")
R7 <- c("22", "25", "4", "5", "0.40", "0.70", "1.07", "1.20", "1.40", "1.50")
R8 <- c("26", "30", "4", "5", "0.55", "0.80", "1.09", "1.34", "1.67", "1.99")
table1 <- as.data.frame(rbind(R1, R2, R3, R4, R5, R6, R7, R8))

Как мне теперь«сгладить» это так, что я получаю таблицу R с «Мин. возрастом», «Макс. возрастом», «Мин. длительностью», «Макс. длительностью», «Площадь», «Уровень», «Цена»"колонны.Если в столбце «Площадь» указано «ЕС» или «США», в столбце «Уровень» отображается 1, 2 или 3, а затем в столбце «Цена» отображается соответствующая цена, найденная в таблице Excel?

Я бы использовал функцию сбора от tidyr, если бы не было нескольких строк заголовка, но, похоже, он не может работать с этими данными, какие-либо идеи?

Вывод должен иметь в общей сложности 36 строк +заголовки

1 Ответ

0 голосов
/ 12 октября 2018

Если вы пропустите первую строку, как предлагает akrun, вы, вероятно, в итоге получите данные, которые выглядят примерно так: (с "X" s и ".1" / ". 2", автоматически добавляемыми R)

library(tidyverse)

df <- tribble(
    ~Min.Age, ~Max.Age, ~Min.Duration, ~Max.Duration,  ~X1.1,  ~X2.1,  ~X3.1, ~X1.2, ~X2.2, ~X3.2,
    "18",     "21",           "1",           "3", "0.12", "0.32", "0.67",  "0.80",  "0.90",  "1.01",
    "22",     "25",           "1",           "3", "0.20", "0.40", "0.70",  "0.85",  "0.98",  "1.05",
    "26",     "30",           "1",           "3", "0.25", "0.50", "0.80",  "0.90",  "1.05",  "1.21",
    "18",     "21",           "4",           "5", "0.32", "0.60", "0.95",  "0.99",  "1.30",  "1.40",
    "22",     "25",           "4",           "5", "0.40", "0.70", "1.07",  "1.20",  "1.40",  "1.50",
    "26",     "30",           "4",           "5", "0.55", "0.80", "1.09",  "1.34",  "1.67",  "1.99"
)

С этими данными вы можете затем использовать gather, чтобы собрать все заголовки, начиная с X, в один столбец, а цену - в другой.Вы можете separate заголовки в «Уровень» и «Площадь».Наконец, закодируйте Area и удалите «X» из уровней.

df %>% 
    gather(headers, Price, starts_with("X")) %>% 
    separate(headers, c("Level", "Area")) %>% 
    mutate(Area = if_else(Area == "1", "EU", "US"),
           Level = parse_number(Level))
#> # A tibble: 36 x 7
#>    Min.Age Max.Age Min.Duration Max.Duration Level Area  Price
#>    <chr>   <chr>   <chr>        <chr>        <dbl> <chr> <chr>
#>  1 18      21      1            3                1 EU    0.12 
#>  2 22      25      1            3                1 EU    0.20 
#>  3 26      30      1            3                1 EU    0.25 
#>  4 18      21      4            5                1 EU    0.32 
#>  5 22      25      4            5                1 EU    0.40 
#>  6 26      30      4            5                1 EU    0.55 
#>  7 18      21      1            3                2 EU    0.32 
#>  8 22      25      1            3                2 EU    0.40 
#>  9 26      30      1            3                2 EU    0.50 
#> 10 18      21      4            5                2 EU    0.60 
#> # ... with 26 more rows

Создано в 2018-10-12 пакетом представлением (v0.2.1)

PS. Здесь вы можете найти множество рабочих процессов по обработке электронных таблиц: https://nacnudus.github.io/spreadsheet-munging-strategies/small-multiples-with-all-headers-present-for-each-multiple.html

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