#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