Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用regexp选择R数据帧中的行_Regex_R_Dataframe - Fatal编程技术网

使用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