我想从数据框架中根据一列中字符串的部分匹配来选择行,例如,列‘ x’包含字符串“ hsa”。使用 sqldf-如果它有一个 like语法-我可以这样做:
sqldf
like
select * from <> where x like 'hsa'.
select * from <> where x like 'hsa'
不幸的是,sqldf不支持这种语法。
或者类似的:
selectedRows <- df[ , df$x %like% "hsa-"]
当然不行。
有人能帮帮我吗?
我注意到您在当前方法中提到了函数 %like%。我不知道这是否是“ data.table”中对 %like%的引用,但如果是的话,您完全可以按照以下方式使用它。
%like%
请注意,对象不一定是 data.table(但也要记住,data.frame和 data.table的子设置方法并不相同) :
data.table
data.frame
library(data.table) mtcars[rownames(mtcars) %like% "Merc", ] iris[iris$Species %like% "osa", ]
如果这就是您所拥有的,那么您可能只是混合了行和列的位置来设置数据子集。
如果不想加载包,可以尝试使用 grep()搜索正在匹配的字符串。下面是一个使用 mtcars数据集的示例,其中我们匹配所有行名中包含“ Merc”的行:
grep()
mtcars
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:
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应该工作在狭窄的环境中:
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(),它检测字符串中是否存在模式。
str_detect()
下面是一种方法,它也包含了 %>%管道和 Dplyr包中的 filter():
%>%
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 包的文档。
str_detect
另一种选择是简单地使用 grepl函数:
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