使用regexp选择R数据帧中的行
我试图在数据框中选择列中包含的字符串与正则表达式或子字符串匹配的行: 数据帧:使用regexp选择R数据帧中的行,regex,r,dataframe,Regex,R,Dataframe,我试图在数据框中选择列中包含的字符串与正则表达式或子字符串匹配的行: 数据帧: aName bName pName call alleles logRatio strength AX-11086564 F08_ADN103 2011-02-10_R10 AB CG 0.363371 10.184215 AX-11086564 A01_CD1919 2011-02-24_R11 BB GG -1.352707 9.54909 AX-11086564
aName bName pName call alleles logRatio strength
AX-11086564 F08_ADN103 2011-02-10_R10 AB CG 0.363371 10.184215
AX-11086564 A01_CD1919 2011-02-24_R11 BB GG -1.352707 9.54909
AX-11086564 B05_CD2920 2011-01-27_R6 AB CG -0.183802 9.766334
AX-11086564 D04_CD5950 2011-02-09_R9 AB CG 0.162586 10.165051
AX-11086564 D07_CD6025 2011-02-10_R10 AB CG -0.397097 9.940238
AX-11086564 B05_CD3630 2011-02-02_R7 AA CC 2.349906 9.153076
AX-11086564 D04_ADN103 2011-02-10_R2 BB GG -1.898088 9.872966
AX-11086564 A01_CD2588 2011-01-27_R5 BB GG -1.208094 9.239801
例如,我希望数据框只包含列bName
中包含ADN
的行。其次,我希望列bName
中包含ADN
的所有行以及列pName
中匹配2011-02-10_R2
的所有行
我尝试过使用函数grep()
,agrep()
等等,但没有成功…为什么不只是:
grep 'ADN'|grep '2011-02-10_R2'
您也可以这样做:
grep -P '\t.{4}(ADN).*(2011-02-10_R2).*'
给你
首先重新创建数据:
dat <- read.table(text="
aName bName pName call alleles logRatio strength
AX-11086564 F08_ADN103 2011-02-10_R10 AB CG 0.363371 10.184215
AX-11086564 A01_CD1919 2011-02-24_R11 BB GG -1.352707 9.54909
AX-11086564 B05_CD2920 2011-01-27_R6 AB CG -0.183802 9.766334
AX-11086564 D04_CD5950 2011-02-09_R9 AB CG 0.162586 10.165051
AX-11086564 D07_CD6025 2011-02-10_R10 AB CG -0.397097 9.940238
AX-11086564 B05_CD3630 2011-02-02_R7 AA CC 2.349906 9.153076
AX-11086564 D04_ADN103 2011-02-10_R2 BB GG -1.898088 9.872966
AX-11086564 A01_CD2588 2011-01-27_R5 BB GG -1.208094 9.239801
", header=TRUE)
现在,使用和运算符:
dat[index1 & index2, ]
aName bName pName call alleles logRatio strength
7 AX-11086564 D04_ADN103 2011-02-10_R2 BB GG -1.898088 9.872966
根据安德烈的建议更正。我希望这能奏效
注意“&”(而非“&&”未矢量化)和“==”(而非“=”为赋值)
请注意,您可以使用:
dat[ with(dat, grepl("ADN", bName) & pName == "2011-02-10_R2" ) , ]
。。。但是,当在函数内部使用时,这可能更可取,因为对于dat$pName为NA的任何行,这将返回NA值。该缺陷(有些人认为是一个特性)可以通过添加&来消除!将.na(dat$pName)
转换为逻辑表达式 我使用和使用.Net风格的正则表达式进行测试;你可能需要调整你的正则表达式风格。为了便于阅读,我还保留了空格;删除或使用regex选项标志忽略
捕获所有行的基本正则表达式是:
(?<aName> [\w-]+ ) \s+ (?<bName> [\w_]+ ) \s+ (?<pName> [\w-_]+ ) \s+ (?<call> \w+ ) \s+ (?<alleles> \w+ ) \s+ (?<logRatio> [\d\.-]+ ) \s+ (?<strength> [\d\.-]+ )
(?[\w-]+)\s+(?[\w-+)\s+(?[\w-+)\s+(?\w+)\s+(?\w+)\s+(?[\d\.-]+)\s+(?[\d\.-]+)
因此,您只需要调整相应命名捕获组的正则表达式,以仅提取所需的行。使用您给出的标准(bName包含“ADN”和pName=“2011-02-10_R2”)捕获的修改版本为:
(?[\w-]+)\s+(?[\w-]*ADN[\w-]*)\s+(?2011-02-10_R2)\s+(?\w+)\s+(?\w+)\s+(?[\d\.-]+)\s+(?[\d\.-]+)
这是一个使用dplyr和magrittr的非常简单的解决方案,我想这正是您想要的:
Data:
library(magrittr)
library(stringr)
dat <- read.table(text="
aName bName pName call alleles logRatio strength
AX-11086564 F08_ADN103 2011-02-10_R10 AB CG 0.363371 10.184215
AX-11086564 A01_CD1919 2011-02-24_R11 BB GG -1.352707 9.54909
AX-11086564 B05_CD2920 2011-01-27_R6 AB CG -0.183802 9.766334
AX-11086564 D04_CD5950 2011-02-09_R9 AB CG 0.162586 10.165051
AX-11086564 D07_CD6025 2011-02-10_R10 AB CG -0.397097 9.940238
AX-11086564 B05_CD3630 2011-02-02_R7 AA CC 2.349906 9.153076
AX-11086564 D04_ADN103 2011-02-10_R2 BB GG -1.898088 9.872966
AX-11086564 A01_CD2588 2011-01-27_R5 BB GG -1.208094 9.239801
", header=TRUE)
第二,我希望在bName列中包含ADN的所有行
与pName列中的2011-02-10_R2相匹配
与上述逻辑相同
df %>%
filter(grepl("ADN", bName) & grepl("2011-02-10_R2", pName))
# aName bName pName call alleles logRatio strength
# 1 AX-11086564 D04_ADN103 2011-02-10_R2 BB GG -1.898088 9.872966
因为语言很抱歉,没有注意到“r”。我想您可以复制我的regexp,然后这两条语句都返回一个空数据帧,而不是所需的第1行和第7行<代码>str_detect(bName,“ADN”)
就足够了
(?<aName> [\w-]+ ) \s+ (?<bName> [\w_]+ ) \s+ (?<pName> [\w-_]+ ) \s+ (?<call> \w+ ) \s+ (?<alleles> \w+ ) \s+ (?<logRatio> [\d\.-]+ ) \s+ (?<strength> [\d\.-]+ )
(?<aName> [\w-]+ ) \s+ (?<bName> [\w_]*ADN[\w_]* ) \s+ (?<pName> 2011-02-10_R2 ) \s+ (?<call> \w+ ) \s+ (?<alleles> \w+ ) \s+ (?<logRatio> [\d\.-]+ ) \s+ (?<strength> [\d\.-]+ )
Data:
library(magrittr)
library(stringr)
dat <- read.table(text="
aName bName pName call alleles logRatio strength
AX-11086564 F08_ADN103 2011-02-10_R10 AB CG 0.363371 10.184215
AX-11086564 A01_CD1919 2011-02-24_R11 BB GG -1.352707 9.54909
AX-11086564 B05_CD2920 2011-01-27_R6 AB CG -0.183802 9.766334
AX-11086564 D04_CD5950 2011-02-09_R9 AB CG 0.162586 10.165051
AX-11086564 D07_CD6025 2011-02-10_R10 AB CG -0.397097 9.940238
AX-11086564 B05_CD3630 2011-02-02_R7 AA CC 2.349906 9.153076
AX-11086564 D04_ADN103 2011-02-10_R2 BB GG -1.898088 9.872966
AX-11086564 A01_CD2588 2011-01-27_R5 BB GG -1.208094 9.239801
", header=TRUE)
dat %>%
filter(str_detect(bName, "ADN") == TRUE)
dat %>%
filter(str_detect(bName, "ADN") & pName == "2011-02-10_R2")
df %>%
filter(grepl("ADN", bName) & grepl("2011-02-10_R2", pName))
# aName bName pName call alleles logRatio strength
# 1 AX-11086564 D04_ADN103 2011-02-10_R2 BB GG -1.898088 9.872966