选择列具有类似'hsa ..'的字符串的行(部分字符串匹配)

时间:2012-10-24 06:25:55

标签: string r match

我有一个包含micro RNA数据的371MB文本文件。基本上,我只想选择那些包含人类microRNA信息的行。

我使用read.table读取了该文件。通常,我会用sqldf完成我想要的 - 如果它有'like'语法(select * from<>其中miRNA就像'hsa')。不幸的是 - sqldf不支持该语法。

我怎样才能在R中这样做?我查看了stackoverflow,但没有看到我如何进行部分字符串匹配的示例。我甚至安装了stringr包 - 但它并不完全符合我的需要。

我想做的是这样的 - 所有选择了hsa- * 的行。

selectedRows <- conservedData[, conservedData$miRNA %like% "hsa-"]

当然,语法不正确。

有人可以帮帮我吗?非常感谢阅读。

阿斯达

4 个答案:

答案 0 :(得分:120)

我注意到你在当前的方法中提到了一个函数%like%。我不知道这是否是对“data.table”中的%like%的引用,但如果是,则可以按如下方式使用它。

请注意,该对象不必是data.table(但也要记住data.framedata.table的子集方法不相同):

library(data.table)
mtcars[rownames(mtcars) %like% "Merc", ]
iris[iris$Species %like% "osa", ]

如果这就是你所拥有的,那么你可能只是将行和列位置混合在一起来分组数据。


如果您不想加载包,可以尝试使用grep()来搜索您匹配的字符串。以下是mtcars数据集的示例,其中我们匹配行名称包含“Merc”的所有行:

mtcars[grep("Merc", rownames(mtcars)), ]
             mpg cyl  disp  hp drat   wt qsec vs am gear carb
# Merc 240D   24.4   4 146.7  62 3.69 3.19 20.0  1  0    4    2
# Merc 230    22.8   4 140.8  95 3.92 3.15 22.9  1  0    4    2
# Merc 280    19.2   6 167.6 123 3.92 3.44 18.3  1  0    4    4
# Merc 280C   17.8   6 167.6 123 3.92 3.44 18.9  1  0    4    4
# Merc 450SE  16.4   8 275.8 180 3.07 4.07 17.4  0  0    3    3
# Merc 450SL  17.3   8 275.8 180 3.07 3.73 17.6  0  0    3    3
# Merc 450SLC 15.2   8 275.8 180 3.07 3.78 18.0  0  0    3    3

另一个例子,使用iris数据集搜索字符串osa

irisSubset <- iris[grep("osa", iris$Species), ]
head(irisSubset)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

对于您的问题,请尝试:

selectedRows <- conservedData[grep("hsa-", conservedData$miRNA), ]

答案 1 :(得分:49)

stringr包中尝试str_detect(),该包会检测字符串中是否存在模式。

这是一种方法,它还包含dplyr包中的%>%管道和filter()

library(stringr)
library(dplyr)

CO2 %>%
  filter(str_detect(Treatment, "non"))

   Plant        Type  Treatment conc uptake
1    Qn1      Quebec nonchilled   95   16.0
2    Qn1      Quebec nonchilled  175   30.4
3    Qn1      Quebec nonchilled  250   34.8
4    Qn1      Quebec nonchilled  350   37.2
5    Qn1      Quebec nonchilled  500   35.3
...

这会过滤处理变量包含子字符串“non”的行的样本CO2数据集(R附带)。您可以调整str_detect是否找到固定匹配项或使用正则表达式 - 请参阅stringr包的文档。

答案 2 :(得分:19)

LIKE应该在sqlite中运行:

require(sqldf)
df <- data.frame(name = c('bob','robert','peter'),id=c(1,2,3))
sqldf("select * from df where name LIKE '%er%'")
    name id
1 robert  2
2  peter  3

答案 3 :(得分:1)

另一种选择是仅使用def fibonacci(n): if n == 0 or n ==1: return 1 elif n == 2: return 2 else: fn = fibonacci(n-1) + fibonacci(n-2) return fn 函数:

grepl