Изменить форму кадра данных, который содержит годы в именах столбцов - PullRequest
2 голосов
/ 05 июня 2019

Я пытаюсь преобразовать широкий фрейм данных в R в длинный фрейм данных.Читая некоторые функции в reshape2 и tidyr, они все, кажется, просто обрабатывают, если у вас есть 1 переменная, которую вы разделяете, тогда как у меня ~ 10.У каждого столбца есть имена переменных типа и год, и я бы хотел, чтобы он разбивался так, чтобы годы стали фактором в каждой строке, а затем имели значительно меньше столбцов и более простой набор данных для работы.

В настоящее время таблица выглядит примерно так.

 State  Rank  Name     V1_2016  V1_2017  V1_2018  V2_2016  V2_2017  V2_2018 
 TX     1     Company  1        2        3        4        5        6  

Я пытался растопить данные с помощью reshape2, но получилось, что они выглядят как мусор и представляют собой 127 тыс. Строк, когда их должно быть только около 10 тыс..

Я пытаюсь заставить данные выглядеть примерно так.

  State Rank    Name Year V1 V2
1    TX    1 Company 2016  1  4
2    TX    1 Company 2017  2  5
3    TX    1 Company 2018  3  6

Ответы [ 2 ]

4 голосов
/ 06 июня 2019

Одна dplyr и tidyr возможность может быть:

df %>%
 gather(var, val, -c(1:3)) %>%
 separate(var, c("var", "Year")) %>%
 spread(var, val)

  State Rank    Name Year V1 V2
1    TX    1 Company 2016  1  4
2    TX    1 Company 2017  2  5
3    TX    1 Company 2018  3  6

Это, во-первых, преобразует данные из широкого в длинный формат, исключая первые три столбца. Во-вторых, он разделяет исходные имена переменных на две новые переменные: одна содержит префикс переменной, вторая - год. Наконец, он распространяет данные.

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

Опция с melt из data.table, которая может принимать несколько measure на основе patterns в именах столбцов

library(data.table)
nm1 <- unique(sub(".*_", "", names(df)[-(1:3)]))
melt(setDT(df), measure = patterns("V1", "V2"),
       value.name = c("V1", "V2"), variable.name = "Year")[,
       Year := nm1[Year]][]
#    State Rank    Name Year V1 V2
#1:    TX    1 Company 2016  1  4
#2:    TX    1 Company 2017  2  5
#3:    TX    1 Company 2018  3  6

data

df <- structure(list(State = "TX", Rank = 1L, Name = "Company", V1_2016 = 1L, 
    V1_2017 = 2L, V1_2018 = 3L, V2_2016 = 4L, V2_2017 = 5L, V2_2018 = 6L),
    class = "data.frame", row.names = c(NA, 
-1L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...