Как извлечь номер из строки символов в R? - PullRequest
0 голосов
/ 08 января 2019

У меня есть такой фрейм данных:

    > dns1
               variant_id         gene_id pval_nominal
21821  chr1_165656237_T_C_b38 ENSG00000143149  1.24119e-05
21822 chr1_165659346_C_CA_b38 ENSG00000143149  1.24119e-05
21823  chr1_165659350_A_G_b38 ENSG00000143149  1.24119e-05
21824  chr1_165659415_A_G_b38 ENSG00000143149  1.24119e-05
21825  chr1_165660430_T_C_b38 ENSG00000143149  1.24119e-05
21826  chr1_165661135_T_G_b38 ENSG00000143149  1.24119e-05
21827  chr1_165661238_C_T_b38 ENSG00000143149  1.24119e-05
...

Я хотел бы удалить все символы из второго столбца (variable_id) и извлечь только второе число, чтобы оно выглядело так:

165656237
165659346
165659350
165659415
165660430
165661135
165661238
...

Я пробовал это:

dns1$variant_id <- gsub('[^0-9.]','',dns1$variant_id)

но с помощью приведенной выше команды я получаю следующее:

> dns1
      variant_id         gene_id pval_nominal
21821    116565623738 ENSG00000143149  1.24119e-05
21822    116565934638 ENSG00000143149  1.24119e-05
21823    116565935038 ENSG00000143149  1.24119e-05
21824    116565941538 ENSG00000143149  1.24119e-05
...

так что это соответствует всем числам в столбце option_id, и мне нужно было бы получить 16565623738 вместо 116565623738. Итак, вопрос в том, как сопоставить во втором столбце только второе число?

Ответы [ 5 ]

0 голосов
/ 09 января 2019

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

dns$variant_id_new <- sapply(strsplit(as.character(dns$variant_id), "_"), unlist)[2,]

Логически это сначала разбивает все строки в variant_id на _. sapply(,unlist) превращает это в матрицу, где мы берем вторую строку (для второй переменной).

0 голосов
/ 09 января 2019

Вот вариант использования stringr:

library(stringr)

df <-
  data.frame(variant_id = c("chr1_165656237_T_C_b38",
                            "chr1_165659346_C_CA_b38",
                            "chr1_165659350_A_G_b38",
                            "chr1_165659415_A_G_b38",
                            "chr1_165660430_T_C_b38",
                            "chr1_165661135_T_G_b38",
                            "chr1_165661238_C_T_b38"))

df$variant_id_extract <-
  str_replace(df$variant_id, "^.+_(\\d+)_.+$", "\\1")

df
#>                variant_id variant_id_extract
#> 1  chr1_165656237_T_C_b38          165656237
#> 2 chr1_165659346_C_CA_b38          165659346
#> 3  chr1_165659350_A_G_b38          165659350
#> 4  chr1_165659415_A_G_b38          165659415
#> 5  chr1_165660430_T_C_b38          165660430
#> 6  chr1_165661135_T_G_b38          165661135
#> 7  chr1_165661238_C_T_b38          165661238
0 голосов
/ 09 января 2019

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

dns1$variant_id <- sub('^[^_]*_(\\d+).*', '\\1', dns1$variant_id)

См. Демоверсию regex

Детали

  • ^ - начало строки
  • [^_]* - 0+ символов, отличных от _
  • _ - подчеркивание
  • (\\d+) - Группа 1: одна или несколько цифр
  • .* - остаток строки.

Функция sub будет выполнять только одну операцию поиска и замены для каждой строки, а обратная ссылка \1 в замене вернет содержимое в группу 1.

Демонстрационная версия R :

variant_id <- c("chr1_165656237_T_C_b38", "chr1_165659346_C_CA_b38")
dns1 <- data.frame(variant_id)
dns1$variant_id <- sub('^[^_]*_(\\d+).*', '\\1', dns1$variant_id)
dns1
##=> variant_id
## 1  165656237
## 2  165659346
0 голосов
/ 09 января 2019

Полагаю, вы можете поймать цифры следующим образом:

gsub(".*?_([[:digit:]]+)_.*", "\\1", dns1$variant_id)
0 голосов
/ 09 января 2019

Вот супер хакерское решение, которое использует и gsub, и str_replace (из stringr). Я уверен, что есть лучшие решения, и для этого необходимо, чтобы option_id всегда начинался с chr1_, что может быть не совсем справедливо.

dns1$variant_id <- gsub('_(.*)','', str_replace(dns1$variant_id, 'chr1_',''))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...