Сводные элементы с более длинными вложенными столбцами

#r #dplyr

#r #dplyr

Вопрос:

У меня есть некоторые данные, которые выглядят так:

    MainID            ID1_Score1         ID2_Score2          ID3_Score3            ID4_Score4
1     379 ('2512008_AD', 0.969) ('2512006', 0.028)    ('25023', 0.003)                      
2     296    ('0810105', 0.993) ('0801904', 0.004)    ('08077', 0.002)    ('0810102', 0.001)
3     152    ('0812101', 0.454) ('0812106', 0.452)  ('0812104', 0.001)                      
4     368    ('0824506', 0.849) ('0824505', 0.134)  ('0824502', 0.006)    ('0801509', 0.004)
5     279    ('0801507', 0.843) ('0801508', 0.156)  ('0801502', 0.001)                      
6     295    ('0810104', 0.979) ('0810101', 0.014)  ('0810105', 0.006)                      
7      22    ('0801902', 0.994) ('0801903', 0.006)                                          
8     136 ('2512008_AD', 0.897) ('2512004', 0.049)   ('2512003', 0.04)   ('25011_AM', 0.005)
9     180   ('25173_AM', 0.977)    ('25234', 0.02) ('22084_AM', 0.003)                      
10    248    ('0827902', 0.511) ('0827906', 0.484)  ('0818703', 0.002) ('0827903_AD', 0.002)
  

Я хочу, чтобы данные поворачивались дольше / расширяли скобки в столбцах. Используя первые две строки и последнюю строку, я пытаюсь получить данные в следующем формате:

Ожидаемый результат:

 MainID      ID               Score
379        2512008_AD        0.969
379        2512006           0.028
379        25023             0.003

296        0810105           0.993
296        0801904           0.004
296        08077             0.002
296        0810102           0.001

...


248        0827902           0.511
248        0827906           0.484
248        0818703           0.002
248        0827903           0.002
  

Где первая строка была расширена каждым из 3 столбцов, заключенных в квадратные скобки (и создано 3 наблюдения для MainID = 379 .

Данные:

 myData <- structure(list(MainID = c(379L, 296L, 152L, 368L, 279L, 295L, 
22L, 136L, 180L, 248L), ID1_Score1 = c("('2512008_AD', 0.969)", 
"('0810105', 0.993)", "('0812101', 0.454)", "('0824506', 0.849)", 
"('0801507', 0.843)", "('0810104', 0.979)", "('0801902', 0.994)", 
"('2512008_AD', 0.897)", "('25173_AM', 0.977)", "('0827902', 0.511)"
), ID2_Score2 = c("('2512006', 0.028)", "('0801904', 0.004)", 
"('0812106', 0.452)", "('0824505', 0.134)", "('0801508', 0.156)", 
"('0810101', 0.014)", "('0801903', 0.006)", "('2512004', 0.049)", 
"('25234', 0.02)", "('0827906', 0.484)"), ID3_Score3 = c("('25023', 0.003)", 
"('08077', 0.002)", "('0812104', 0.001)", "('0824502', 0.006)", 
"('0801502', 0.001)", "('0810105', 0.006)", "", "('2512003', 0.04)", 
"('22084_AM', 0.003)", "('0818703', 0.002)"), ID4_Score4 = c("", 
"('0810102', 0.001)", "", "('0801509', 0.004)", "", "", "", "('25011_AM', 0.005)", 
"", "('0827903_AD', 0.002)")), row.names = c(NA, 10L), class = "data.frame")
  

Ответ №1:

Вы могли бы сделать:

 library(tidyverse)
myData %>% 
       pivot_longer(-MainID) %>%
       extract(value, c('ID', 'Score'), "(\w )\W \s(\S \d)", convert = TRUE) %>%
       select(-name)


   # A tibble: 40 x 3
   MainID ID         Score
    <int> <chr>      <chr>
 1    379 2512008_AD 0.969
 2    379 2512006    0.028
 3    379 25023      0.003
 4    379 NA         NA   
 5    296 0810105    0.993
 6    296 0801904    0.004
 7    296 08077      0.002
 8    296 0810102    0.001
 9    152 0812101    0.454
10    152 0812106    0.452
# ... with 30 more rows