提问人:Corvus 提问时间:2/1/2013 更新时间:2/1/2013 访问量:82119
如何根据子字符串匹配选择 R data.table 行(类似于 SQL)
How to select R data.table rows based on substring match (a la SQL like)
问:
我有一个带有字符列的 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”的行?
答:
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()
grepl
grep
> 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.table
Months[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
你能用它来搜索多个字符串吗?
评论