library(tidyverse)
as.data.frame(M, stringsAsFactors = FALSE) %>%
rownames_to_column('id') %>%
mutate(
id = gsub('SuperSMART_', 'S', id),
id = gsub('(^S)(\\d{2})(_)', '\\10\\2\\3', id, perl = TRUE)
) %>%
separate(id, into = c('S', 'R', 'p'), sep = '_', remove = FALSE) %>%
mutate(., group = group_indices(., S))
## id S R p x group
## 1 S003_T1_p555 S003 T1 p555 1 1
## 2 S003_T2_p456 S003 T2 p456 2 1
## 3 S004_T3_p785 S004 T3 p785 3 2
## 4 S004_T4_p426 S004 T4 p426 4 2
## 5 S027_T1_p112 S027 T1 p112 5 3
## 6 S027_T2_p414 S027 T2 p414 6 3
## 7 S042_T3_p155 S042 T3 p155 7 4
## 8 S042_T5_p775 S042 T5 p775 8 4
## If you really want it as a function:
normalize_data <- function(m, ..) {
as.data.frame(m, stringsAsFactors = FALSE) %>%
tibble::rownames_to_column('id') %>%
dplyr::mutate(
id = gsub('SuperSMART_', 'S', id),
id = gsub('(^S)(\\d{2})(_)', '\\10\\2\\3', id, perl = TRUE)
) %>%
tidyr::separate(id, into = c('S', 'R', 'p'), sep = '_', remove = FALSE) %>%
dplyr::mutate(., group = dplyr::group_indices(., S))
}
Итак, это групповой снимок, обозначаемый круглыми скобками '(^S)(\d{2})(_)'
.Есть 3 группы в плен.1: (^S)
, 2: (\d{2})
, 3: (_)
.Первый говорит, хватай с начала (^
) и S
.Вторая группа говорит, что захватите после этого, где есть ровно 2 цифры (\\d{2}
), а затем третья группа говорит, что за ней должно следовать подчеркивание.
Так что S27_T2_p414
будет соответствовать этому, но S004_T3_p785
не будет.
Для замены '\10\2\3'
.... Если он соответствует '(^S)(\d{2})(_)'
, мы можем использовать perl = TRUE
для замены захвата группы (обозначено скобками выше. \1
соответствует (^S)
;\2
соответствует (\d{2})
И \3
идет с (_)
. Мы можем вставлять вещи между группами захвата. Этот метод называется обратная ссылка . В этом случае я вставляю дополнительный ноль междупервая группа захвата и вторая для обеспечения того, чтобы все числа имели 3 цифры. Это предполагает, что самое большее у вас есть 3 цифры в строке после S
.