назначить определенные символы для строк в кадре данных - PullRequest
0 голосов
/ 01 марта 2019

У меня есть огромный фрейм данных, который выглядит следующим образом в R

    scan_id       sample
1  s8w_00001.sed      1
2  s8w_00001.sed      1
3  s9w_00001.sed      1
4 s10w_00001.sed      1
5 s11d_00002.sed      1
6 s12w_00004.sed      1
7 s13w_00001.sed      1
8 s14w_00001.sed      1

Столбец с меткой sample должен иметь значения, соответствующие столбцу с меткой scan_id.Так что для наблюдения, где у меня есть scan_id = s8w_00001.sed, выборка должна быть 8. Потому что в этой строке 8 символов.У меня должно быть что-то похожее на это.

 scan_id          sample
1  s8w_00001.sed      8
2  s8w_00002.sed      8
3  s9w_00001.sed      9
4 s10w_00001.sed     10
5 s11d_00002.sed     11
6 s12w_00004.sed     12
7 s13w_00001.sed     13
8 s14w_00001.sed     14

Кто-нибудь может помочь?

Ответы [ 4 ]

0 голосов
/ 01 марта 2019

Вы также можете сделать:

df$sample <- gsub("\\D", "", sapply(strsplit(df$scan_id, "_"), function(x) x[1]))

         scan_id sample
1  s8w_00001.sed      8
2  s8w_00001.sed      8
3  s9w_00001.sed      9
4 s10w_00001.sed     10
5 s11d_00002.sed     11
6 s12w_00004.sed     12
7 s13w_00001.sed     13
8 s14w_00001.sed     14

Здесь он разбивает «scan_id» на _, а затем извлекает числа из первого элемента после разделения.

0 голосов
/ 01 марта 2019

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

gsub('s([0-9]+)[a-z]+_.*$', '\\1', df$scan_id)
#[1] "8"  "8"  "9"  "10" "11" "12" "13" "14"
0 голосов
/ 01 марта 2019

Если вы просто хотите извлечь первые цифры из столбца scan_id, вы можете использовать mutate(data, sample = str_extract(scan_id, "[:digit:]+")) из tidyverse.В этом случае извлекается первый набор цифр.

Если вы хотите указать шаблон перед вашими цифрами, используйте mutate(data, sample = str_extract(scan_id, "(?<=[:alpha:]+)[:digit:]+")).В этом случае извлекается первый набор цифр, которому предшествует набор букв.

0 голосов
/ 01 марта 2019

Один из вариантов - использовать пакет stri_extract_first_regex из stringi

library(stringi)
# Extract the one occurance of a digit [0-9]+ ('+' matches 1 or more digits)
df$samples <- stri_extract_first_regex(df$scan_id, "[0-9]+")

И вывод

> df
         scan_id sample samples
1  s8w_00001.sed      1       8
2  s8w_00001.sed      1       8
3  s9w_00001.sed      1       9
4 s10w_00001.sed      1      10
5 s11d_00002.sed      1      11
6 s12w_00004.sed      1      12
7 s13w_00001.sed      1      13
8 s14w_00001.sed      1      14

Где df:

df <- read.table(text = "scan_id       sample
  s8w_00001.sed      1
  s8w_00001.sed      1
  s9w_00001.sed      1
 s10w_00001.sed      1
 s11d_00002.sed      1
 s12w_00004.sed      1
 s13w_00001.sed      1
 s14w_00001.sed      1", header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...