[英]What is the correct way to extract multiple required patterns from a column in the data using regular expression (grepl function) in R
我有一个数据框(也可以使用我生成的CSV文件),它有7列,接近一百万行。
我特别有兴趣从单个列中存在的整个数据字符串中提取5个不同的“ ID”,并希望使用特定的“ ID”作为列标题名称来创建新列。数据看起来像这样-
UNIQUE-NAME TYPES COMMON-NAME FORMULA SOURCE WEIGHT SECONDARY-WEIGHT
CPD-12676 Compounds glycerophosphoglycerol (C 19);(H 29);(N 5);(O 10);(S 2) (SPIDER "3315400" NIL | devarsh | 3468 NIL);(PUBCHEM "54758713" NIL | ong);(SMALL "35022" | NIL | Tom);(CHEBI "28643" | NIL);(BAS "55672-34-1" | Harry | NILL) 29.83 27.65
CPD-380 Enamines UDP NA NA 294.37 287.33
NAD Steroids prephenate (O 4);(S 1) (PUBCHEM "87361293" NIL | ong);(CHEBI "87100" | NIL); (BAS "91234-28-2" | Harry | NILL) 373.47 381.24
ADP Rings pyridine (C 5);(H 5);(N 1) (SPIDER "2311345" NIL | devarsh | 6789 NIL);(SMALL "98234" | NIL | Tom) 39.33 40.65
CAD-392 Molecules pyrine (C 10);(H 9) (SPIDER "5454678" NIL | devarsh | 7688 NIL) 392.543 400.656
CAD-355 Groups solution (C 12);(H 12) NA 32.53 40.66
CPD-39234 Compounds glycerophosphoglycerol (C 19);(H 29);(N 5);(O 10);(S 2) (SMALL "45465" | NIL | Harry);(CHEBI "33490" | NIL) 92.43 100.65
现在,我对“源”列感兴趣,并希望获取
SPIDER ID, PUBCHEM ID, SMALL ID, CHEBI ID AND BAS ID
并在我的csv文件中创建一个新列,并将每个ID作为列标题,并将ID号存储为行。
所以,我希望我的最终输出表是这样的-
UNIQUE-NAME TYPES COMMON-NAME FORMULA SMALL ID PUBCHEM ID SPIDER ID CHEBI ID BAS ID WEIGHT SECONDARY-WEIGHT
CPD-12676 Compounds glycerophosphoglycerol (C 19);(H 29);(N 5);(O 10);(S 2) 35022 54758713 3315400 28643 55672-34-1 29.83 27.65
CPD-380 Enamines UDP NA NA NA NA NA NA 294.37 287.33
NAD Steroids prephenate (O 4);(S NA 87361293 NA 87100 91234-28-2 373.47 381.24
ADP Rings pyridine (C 5);(H 5);(N 1) 98234 NA 2311345 NA NA 39.33 40.65
CAD-392 Molecules pyrine (C 10);(H 9) NA NA 5454678 NA NA 392.543 400.656
CAD-355 Groups solution (C 12);(H 12) NA NA NA NA NA 32.53 40.66
CPD-39234 Compounds glycerophosphoglycerol (C 19);(H 29);(N 5);(O 10);(S 2) 45465 NA NA 33490 NA 92.43 100.65
我正在使用grepl
函数来实现此结果-
dt3 <- grepl("^[:punct:]SMALL\\s[:punct:][0-9][:punct:]|^[:punct:]SPIDER\\s[:punct:][0-9][:punct:]|[:punct:]BAS\\s[:punct:][0-9]-+[:punct:]|[:punct:]CHEBI\\s[:punct:][0-9][:punct:]|[:punct:]PUBCHEM\\s[:punct:][0-9][:punct:]", dt2$SOURCE)
其中dt2
是具有数据的数据帧(显示在上面的第一张表中)。 我只使用SOURCE
列,并尝试匹配要获取的列的模式。 grepl
不会抛出任何错误,但是会提供所有FALSE
值,这显然意味着我在这里使用正则表达式语法进行模式匹配时出错了, R
并没有理解我要获取的内容。
非常感谢您的帮助。 谢谢!
样本源数据- 样本数据
尝试将问题范围缩小到所需的最小示例。 例如,数据框的SOURCE
列包含您要匹配正则表达式的字符串:
SOURCE <- '(SPIDER "3315400" NIL | devarsh | 3468 NIL);(PUBCHEM "54758713" NIL | ong)'
您可以使用括号()
提取一组内容,其中每个括号都是一个新的组,并且您可以在另一个组中包含一个组:
pattern <- "((PUBCHEM) \"([0-9]*))"
regmatches(SOURCE, regexec(pattern, SOURCE))
为您提供4个字符串的向量,每个字符串对应一个组。 向量元素3和4拥有PUBCHEM
和54758713
。
这是使用dplyr
和stringr
的非常粗糙的方法。
library(dplyr)
library(stringr)
df %>% # this assumes your data is in a data frame called 'df'
mutate(small_id = str_extract(SOURCE, 'SMALL "[0-9]+"')) %>%
mutate(pubchem_id = str_extract(SOURCE, 'PUBCHEM "[0-9]+"')) %>%
mutate(spider_id = str_extract(SOURCE, 'SPIDER "[0-9]+"')) %>%
mutate(chebi_id = str_extract(SOURCE, 'CHEBI "[0-9]+"')) %>%
mutate(bas_id = str_extract(SOURCE, 'BAS "[0-9]+-[0-9]+-[0-9]+"')) %>%
mutate_at(vars(ends_with('_id')), ~gsub('[A-Z]|"|\\s+', '', .)) %>%
select(-SOURCE)
`UNIQUE-NAME` TYPES `COMMON-NAME` FORMULA WEIGHT `SECONDARY-WEIGHT` small_id pubchem_id spider_id chebi_id bas_id
<chr> <chr> <chr> <chr> <dbl> <dbl> <chr> <chr> <chr> <chr> <chr>
1 CPD-12676 Compounds glycerophosphoglycerol (C 19);(H 29);(N 5);(O 10);(S 2) 29.8 27.6 35022 54758713 3315400 28643 55672-34-1
2 CPD-380 Enamines UDP NA 294. 287. NA NA NA NA NA
3 NAD Steroids prephenate (O 4);(S 1) 373. 381. NA 87361293 NA 87100 91234-28-2
4 ADP Rings pyridine (C 5);(H 5);(N 1) 39.3 40.6 98234 NA 2311345 NA NA
5 CAD-392 Molecules pyrine (C 10);(H 9) 393. 401. NA NA 5454678 NA NA
6 CAD-355 Groups solution (C 12);(H 12) 32.5 40.7 NA NA NA NA NA
7 CPD-39234 Compounds glycerophosphoglycerol (C 19);(H 29);(N 5);(O 10);(S 2) 92.4 101. 45465 NA NA 33490 NA
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.