Сохранение информации о столбцах при объединении нескольких столбцов в один - PullRequest
0 голосов
/ 31 марта 2020

У меня есть таблица данных, которую я расплавил следующим образом:

library(data.table)
DT <- fread(
"ID country year Event_A Event_B
4   NLD   2002  0   1
5   NLD   2002  0   1
6   NLD   2006  1   1
7   NLD   2006  1   0
8   NLD   2006  1   1
9   GBR   2002  0   1
10  GBR   2002  0   0
11  GBR   2002  0   1
12  GBR   2006  1   1
13  GBR   2006  1   1",
header = TRUE)

melt(DT, id.var = setdiff(names(DT), c("Event_A", "Event_B")), 
          value.name = 'Event')[, variable := NULL][order(ID)]
#     ID country year Event
# 1:  4     NLD 2002     0
# 2:  4     NLD 2002     1
# 3:  5     NLD 2002     0
# 4:  5     NLD 2002     1
# 5:  6     NLD 2006     1
# 6:  6     NLD 2006     1
# 7:  7     NLD 2006     1
# 8:  7     NLD 2006     0
# 9:  8     NLD 2006     1
#10:  8     NLD 2006     1
#11:  9     GBR 2002     0
#12:  9     GBR 2002     1
#13: 10     GBR 2002     0
#14: 10     GBR 2002     0
#15: 11     GBR 2002     0
#16: 11     GBR 2002     1
#17: 12     GBR 2006     1
#18: 12     GBR 2006     1
#19: 13     GBR 2006     1
#20: 13     GBR 2006     1

Однако, оглядываясь назад, я хочу иметь категорию Event в наборе расплавленных данных. Как мне убедиться, что эта информация сохраняется в расплавленных данных?

РЕДАКТИРОВАТЬ (из-за чрезмерного упрощения в исходном сообщении):

DT <- fread(
"ID country year Event_A Event_B Choice_A Choice_B
4   NLD   2002  0   1  0   1
5   NLD   2002  0   1  1   1
6   NLD   2006  1   1  0   1
7   NLD   2006  1   0  1   1
8   NLD   2006  1   1  1   1
9   GBR   2002  0   1  1   0
10  GBR   2002  0   0  1   1
11  GBR   2002  0   1  0   1
12  GBR   2006  1   1  1   1
13  GBR   2006  1   1  0   0",
header = TRUE)

DT<- melt(DT, measure = patterns("^Event_", "^Choice_"), 
     value.name =  c("Event", "Choice"))[, variable :=  NULL][order(ID)]

Желаемый вывод:

#     ID country year Event Event_Cat Choice Choice_Cat
# 1:  4     NLD 2002     0  A         0      A
# 2:  4     NLD 2002     1  B         1      B
# 3:  5     NLD 2002     0  A
# 4:  5     NLD 2002     1  B
# 5:  6     NLD 2006     1  A
# 6:  6     NLD 2006     1  B
# 7:  7     NLD 2006     1
# 8:  7     NLD 2006     0
# 9:  8     NLD 2006     1
#10:  8     NLD 2006     1
#11:  9     GBR 2002     0
#12:  9     GBR 2002     1
#13: 10     GBR 2002     0
#14: 10     GBR 2002     0
#15: 11     GBR 2002     0
#16: 11     GBR 2002     1
#17: 12     GBR 2006     1
#18: 12     GBR 2006     1
#19: 13     GBR 2006     1
#20: 13     GBR 2006     1

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Не NULL ify the variable.name:

setnames(
   melt(DT, id.var = setdiff(names(DT), c("Event_A", "Event_B")), value.name = 'Event')[
     , variable:=sub("Event_", "", variable)][order(ID)], 
   old="variable", new="Event_Cat")

    ID country year Event_Cat Event
 1:  4     NLD 2002         A     0
 2:  4     NLD 2002         B     1
 3:  5     NLD 2002         A     0
 4:  5     NLD 2002         B     1
 5:  6     NLD 2006         A     1
 6:  6     NLD 2006         B     1 ...

Редактировать на основе новой предоставленной информации (плавление нескольких столбцов ).

DT2 <- setnames(
  melt(DT, measure = patterns("^Event_", "^Choice_"), 
         value.name =  c("Event", "Choice"))[, variable := forcats::lvls_revalue(variable, 
            c("A", "B"))][order(ID)],
  old="variable", new="Cetegory")
DT2

    ID country year Cetegory Event Choice
 1:  4     NLD 2002        A     0      0
 2:  4     NLD 2002        B     1      1
 3:  5     NLD 2002        A     0      1
 4:  5     NLD 2002        B     1      1
 5:  6     NLD 2006        A     1      0
 6:  6     NLD 2006        B     1      1 ...
1 голос
/ 31 марта 2020

Вы можете использовать pivot_longer из tidyr:

tidyr::pivot_longer(DT, cols = starts_with('Event'), 
                    names_to = c('.value', 'Event_Cat'), 
                    names_sep = '_')


#     ID country  year Event_Cat Event
#   <int> <chr>   <int> <chr>     <int>
# 1     4 NLD      2002 A             0
# 2     4 NLD      2002 B             1
# 3     5 NLD      2002 A             0
# 4     5 NLD      2002 B             1
# 5     6 NLD      2006 A             1
# 6     6 NLD      2006 B             1
# 7     7 NLD      2006 A             1
# 8     7 NLD      2006 B             0
# 9     8 NLD      2006 A             1
#10     8 NLD      2006 B             1
#11     9 GBR      2002 A             0
#12     9 GBR      2002 B             1
#13    10 GBR      2002 A             0
#14    10 GBR      2002 B             0
#15    11 GBR      2002 A             0
#16    11 GBR      2002 B             1
#17    12 GBR      2006 A             1
#18    12 GBR      2006 B             1
#19    13 GBR      2006 A             1
#20    13 GBR      2006 B             1
...