[英]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.