簡體   English   中英

使用正則表達式從R中的數據框列中提取子字符串

[英]Use a regular expression extract substring from data frame columns in R

我對R相當陌生,所以如果這是一個愚蠢的問題,請對我輕松一點。

我有一個名為foo的數據框:

< head(foo)
  Old.Clone.Name New.Clone.Name                                  File
1         A          Aa           A_mask_MF_final_IS2_SAEE7-1_02.nrrd
2         B          Bb   B_mask_MF_final_IS2ViaIS2h_SADQ15-1_02.nrrd
3         C          Cc   C_mask_MF_final_IS2ViaIS2h_SAEC16-1_02.nrrd
4         D          Dd    D_mask_MF_final_IS2ViaIS2h_SAEJ6-1_02.nrrd
5         E          Ee           F_mask_MF_final_IS2_SAED9-1_02.nrrd
6         F          Ff    F_mask_MF_final_IS2ViaIS2h_SAGP3-1_02.nrrd

我想從“ File列中提取與正則表達式(S[AZ]{3}[0-9]{1,2}-[0-9]_02)相匹配的代碼,以便給我:

SAEE7-1_02
SADQ15-1_02
SAEC16-1_02
SAEJ6-1_02
SAED9-1_02
SAGP3-1_02

然后,我想使用這些代碼在另一個目錄中搜索包含相同代碼的其他文件。

但是,我首先遇到了困難,無法從數據幀的該列中提取代碼。

我努力了:

library('stringr')
str_extract(foo[3],regex("(S[A-Z]{3}[0-9]{1,2}-[0-9]_02)", ignore_case = TRUE))

但這只返回[1] NA

我只是缺少明顯的東西嗎? 我期待在社區的幫助下破解此問題。

您好,如果您將數據作為表文件讀取,則foo[3]是一個列表,而str_extract不接受列表,僅接受字符串,那么您應該使用lapply提取每個元素的匹配項。

lapply(foo[3], function(x) str_extract(x, "[sS][a-zA-Z]{3}[0-9]{1,2}-[0-9]_02"))

結果:

[1] "SAEE7-1_02"  "SADQ15-1_02" "SAEC16-1_02" "SAEJ6-1_02"  "SAED9-1_02"
[6] "SAGP3-1_02"
str_extract(foo[3],"(?i)S[A-Z]{3}[0-9]{1,2}-[0-9]_02")

似乎有效。 不知何故,我的R給了我

“ check_pattern(pattern,string)中的錯誤:找不到函數“ regex””

使用原始表達時。

以下代碼將重復您的要求(只需復制並粘貼到R控制台中 ):

library(stringr)
foo = scan(what='')
Old.Clone.Name New.Clone.Name File
A Aa A_mask_MF_final_IS2_SAEE7-1_02.nrrd
B Bb B_mask_MF_final_IS2ViaIS2h_SADQ15-1_02.nrrd
C Cc C_mask_MF_final_IS2ViaIS2h_SAEC16-1_02.nrrd
D Dd D_mask_MF_final_IS2ViaIS2h_SAEJ6-1_02.nrrd
E Ee F_mask_MF_final_IS2_SAED9-1_02.nrrd
F Ff F_mask_MF_final_IS2ViaIS2h_SAGP3-1_02.nrrd


foo = matrix(foo,ncol=3,byrow=T)
colnames(foo)=foo[1,]
foo = foo[-1,]
foo
str_extract(foo[,3],regex("(S[A-Z]{3}[0-9]{1,2}-[0-9]_02)", ignore_case = T))

您得到NULL的原因是隱藏的:R按列存儲條目,因此foo[3]是foo矩陣/數據幀的第3行和第1列。 要引用第三列,您可能需要使用foo[,3] foo<-data.frame(foo); foo[[3]] foo<-data.frame(foo); foo[[3]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM