如何根据子字符串匹配选择 R data.table 行(类似于 SQL)

How to select R data.table rows based on substring match (a la SQL like)

提问人:Corvus 提问时间:2/1/2013 更新时间:2/1/2013 访问量:82119

问:

我有一个带有字符列的 data.table,并且只想选择那些包含子字符串的行。等效于 SQLWHERE x LIKE '%substring%'

例如

> Months = data.table(Name = month.name, Number = 1:12)
> Months["mb" %in% Name]
Empty data.table (0 rows) of 2 cols: Name,Number

如何仅选择名称包含“mb”的行?

r data.table 字符串匹配

评论


答:

10赞 LostLin 2/1/2013 #1

运算符不执行部分字符串匹配 它用于查找值是否存在于另一组值中,即%in%"a" %in% c("a","b","c")

要进行部分字符串匹配,您需要使用该函数。 您可以使用 返回所有列的索引。然后按该索引对行进行子集grep()grep"mb"

Months[grep("mb", Name)]    # data.table syntax slightly easier

评论

2赞 Corvus 2/1/2013
非常感谢,事实上似乎有效。Months[grep("mb", Name)]
0赞 LostLin 2/1/2013
仅当已将 Name 定义为工作区中其他位置的单独向量时,这才有效。请注意您正在使用的变量
1赞 Corvus 2/1/2013
这难道不是因为这是 data.table 与 data.frame 而起作用吗?
0赞 ARAT 9/28/2017
那么,我们如何保存实际的行呢?
103赞 Matt Dowle 2/1/2013 #2

data.table有一个功能。like

Months[like(Name,"mb")]
        Name Number
1: September      9
2:  November     11
3:  December     12

或者,看起来更好:%like%

> Months[Name %like% "mb"]
    Name Number
1: September      9
2:  November     11
3:  December     12

请注意,and use(返回逻辑向量)而不是(返回整数位置)。这样就可以与其他逻辑条件结合使用:%like%like()greplgrep

> Months[Number<12 & Name %like% "mb"]
        Name Number
1: September      9
2:  November     11

此外,您还可以获得正则表达式搜索(而不仅仅是 % 或 * 通配符)的强大功能。

评论

1赞 rafa.pereira 9/30/2015
有没有办法使用这个命令并在没有的情况下更新表,我在想类似的事情<-Months[ Name== like(Name, "mb") ,]
0赞 Matt Dowle 10/1/2015
@RafaelPereira您是否查看了(示例)、阅读了文档并参加了 DataCamp 课程??data.tableMonths[like(Name,"mb"), someCol:=someValue]
0赞 rafa.pereira 10/1/2015
感谢您@Matt-Dowle的建议。也许我还不够清楚。我是想问你的。
1赞 Matt Dowle 10/2/2015
@RafaelPereira我明白了,是的。正如弗兰克现在指出的那样,我也想要这个功能:stackoverflow.com/a/10791729/403310
2赞 user124123 9/23/2016
你能用它来搜索多个字符串吗?