58

我有一个带有字符列的 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”的行?

4

2 回答 2

99

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

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

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

并且您也获得了正则表达式搜索的强大功能(不仅仅是 % 或 * 通配符)。

于 2013-01-31T16:46:24.453 回答
10

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

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

Months[grep("mb", Name)]    # data.table syntax slightly easier
于 2013-01-31T16:23:18.843 回答