根据列中的部分字符串匹配选择数据框架行

我想从数据框架中根据一列中字符串的部分匹配来选择行,例如,列‘ x’包含字符串“ hsa”。使用 sqldf-如果它有一个 like语法-我可以这样做:

select * from <> where x like 'hsa'.

不幸的是,sqldf不支持这种语法。

或者类似的:

selectedRows <- df[ , df$x %like% "hsa-"]

当然不行。

有人能帮帮我吗?

413464 次浏览

我注意到您在当前方法中提到了函数 %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), ]

LIKE应该工作在狭窄的环境中:

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

尝试 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
...

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

另一种选择是简单地使用 grepl函数:

df[grepl('er', df$name), ]
CO2[grepl('non', CO2$Treatment), ]


df <- data.frame(name = c('bob','robert','peter'),
id = c(1,2,3)
)


# name id
# 2 robert  2
# 3  peter  3