Изменить форму, создав новую переменную - PullRequest
0 голосов
/ 16 ноября 2018

Как преобразовать данные, добавив еще одну переменную с именем month в приведенный ниже набор данных

ID   Com    Lac   Nov(PM)    Nov(TM)  Dec(PM) Dec(TM)
1     A      E      12        11        28       29
2     B      F      2         13        26       44
3     C      G      7         15        18       37
4     D      H      4         10        22       22

Вверху находится фрейм данных, который необходимо преобразовать, как показано ниже

ID   Com    Lac   Month    PM     TM
1    A       E     Nov      12    11
1    A       E     Dec      28    29
2    B       F     Nov      2     13
2    B       F     Dec      26    44
3    C       G     Nov      7     15
3    C       G     Dec      18    37
4    D       H     Nov      4     10
4    D       H     Dec      22    22

Данные:

df1 <- structure(list(ID = 1:4, Com = c("A", "B", "C", "D"), Lac = c("E", 
 "F", "G", "H"), `Nov(PM)` = c(12L, 2L, 7L, 4L), `Nov(TM)` = c(11L, 
13L, 15L, 10L), `Dec(PM)` = c(28L, 26L, 18L, 22L), `Dec(TM)` = c(29L, 
44L, 37L, 22L)), class = "data.frame", row.names = c(NA, -4L))

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Самая злая и презираемая из всех функций, reshape, справляется с этим довольно хорошо. Пока вы вращаете имена от "Time(Variable)" до "Variable_Time", все это будет обработано за один раз:

names(df1) <- gsub("(.+?)\\((.+?)\\)", "\\2_\\1", names(df1))
reshape(df1, idvar=c("ID","Com","Lac"), varying=4:7,
        direction="long", sep="_", timevar="Month")

#          ID Com Lac Month PM TM
#1.A.E.Nov  1   A   E   Nov 12 11
#2.B.F.Nov  2   B   F   Nov  2 13
#3.C.G.Nov  3   C   G   Nov  7 15
#4.D.H.Nov  4   D   H   Nov  4 10
#1.A.E.Dec  1   A   E   Dec 28 29
#2.B.F.Dec  2   B   F   Dec 26 44
#3.C.G.Dec  3   C   G   Dec 18 37
#4.D.H.Dec  4   D   H   Dec 22 22
0 голосов
/ 16 ноября 2018

Вот один вариант с tidyverse. Мы gather столбцы 'Nov (PM) to 'Dec(TM) в "длинном" формате, затем с помощью extract, разделить столбец "ключ" на "Месяц" и другой столбец, и, наконец, spread его в "широкий" 'формат

df1 %>%
   gather(key, val, `Nov(PM)`:`Dec(TM)`) %>% 
   extract(key, into = c('Month', 'key'), '^([^)]+)\\(([^)]+).*') %>% 
   spread(key, val)
#  ID Com Lac Month PM TM
#1  1   A   E   Dec 28 29
#2  1   A   E   Nov 12 11
#3  2   B   F   Dec 26 44
#4  2   B   F   Nov  2 13
#5  3   C   G   Dec 18 37
#6  3   C   G   Nov  7 15
#7  4   D   H   Dec 22 22
#8  4   D   H   Nov  4 10

данные

df1 <- structure(list(ID = 1:4, Com = c("A", "B", "C", "D"), Lac = c("E", 
 "F", "G", "H"), `Nov(PM)` = c(12L, 2L, 7L, 4L), `Nov(TM)` = c(11L, 
13L, 15L, 10L), `Dec(PM)` = c(28L, 26L, 18L, 22L), `Dec(TM)` = c(29L, 
44L, 37L, 22L)), class = "data.frame", row.names = c(NA, -4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...