【问题标题】:Matching regular expressions to any of the columns in a dataframe将正则表达式与数据框中的任何列匹配
【发布时间】:2014-08-04 19:11:07
【问题描述】:

从数据框中,我想对包含“A”或“36”或“1?2”等模式的所有行进行子集化。我不在乎哪一列与模式匹配,只要该行某处存在匹配即可。

数据框:

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

我的实际数据框包含许多行,我不想硬编码它们的名称。模式可能更复杂,所以我想使用正则表达式。

在 R 中读取此数据帧的代码:

data <- read.table(textConnection("
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)

【问题讨论】:

标签: regex r dataframe subset


【解决方案1】:

你可以使用greplapplyrowSums

> rowSums(apply(data, 2, grepl, pattern = "A")) > 0
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> rowSums(apply(data, 2, grepl, pattern = "1?2")) > 0
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> rowSums(apply(data, 2, grepl, pattern = "36")) > 0
[1]  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE

> out <- rowSums(apply(data, 2, grepl, pattern = "36")) > 0
> data[out,]
        aName      bName          pName call alleles logRatio  strength
1 AX-11086564 F08_ADN103 2011-02-10_R10   AB      CG 0.363371 10.184215
6 AX-11086564 B05_CD3630  2011-02-02_R7   AA      CC 2.349906  9.153076

注意apply 将由as.vector 强制执行

【讨论】:

  • +1!注意还有apply会强制角色并摆脱因素!
【解决方案2】:

这里我定义了一个 grep 的包装器来在 data.frame 中搜索:

search_data_frame <- 
  function(patt,data)
    unlist(lapply (seq_len(nrow(data)),function(i) grep(patt,data[i,])))

然后你用它:

  data[search_data_frame('36',data),]

        aName      bName          pName call alleles  logRatio strength
6 AX-11086564 B05_CD3630  2011-02-02_R7   AA      CC  2.349906 9.153076
2 AX-11086564 A01_CD1919 2011-02-24_R11   BB      GG -1.352707 9.549090

请注意,我使用 stringsAsFactors=FALSE 读取您的数据,否则您应该在之前将您的因素强制转换为字符。 `

【讨论】:

  • 把它包装在一个函数中的好主意
  • @jdharrison 谢谢..但我想这个想法应该存在于数千个 R 包之一中:)
  • 有时 base 就足够了
  • @jdharrison 完全同意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2014-02-06
  • 1970-01-01
  • 2016-11-10
  • 2015-01-16
相关资源
最近更新 更多