使用SQLDF从列中选择特定值

时间:2011-06-02 14:54:35

标签: sql r

SQLDF新手在这里。

我有一个大约有15,000行和1列的数据框。 数据如下:

cars
autocar
carsinfo
whatisthat
donnadrive
car
telephone
...

我想使用包sqldf循环遍历列和 选择其值中任何位置包含“car”的所有值。 但是,以下代码会生成错误。

> sqldf("SELECT Keyword FROM dat WHERE Keyword="car")
Error: unexpected symbol in "sqldf("SELECT Keyword FROM dat WHERE Keyword="car"

没有意外的符号,所以我不确定是不是错了。

所以首先,我想知道包含'car'的所有值。 那么我只想知道那些只包含'汽车'的价值。

任何人都可以提供帮助。

修改

好吧,有一个意想不到的符号,但它只给我车而不是每一个 包含'car'的行。

> sqldf("SELECT Keyword FROM dat WHERE Keyword='car'")
  Keyword
1     car

4 个答案:

答案 0 :(得分:7)

使用=只会返回完全匹配。

您应该将like运算符与通配符%_结合使用。 %通配符将匹配多个字符,而_匹配单个字符。

以下内容会找到car的所有实例,例如“汽车”,“汽车”等:

sqldf("SELECT Keyword FROM dat WHERE Keyword like '%car%'")

以下内容将匹配“汽车”或“汽车”:

sqldf("SELECT Keyword FROM dat WHERE Keyword like 'car_'")

答案 1 :(得分:3)

这与sqldf无关;你的SQL语句是个问题。你需要:

dat <- data.frame(Keyword=c("cars","autocar","carsinfo",
  "whatisthat","donnadrive","car","telephone"))
sqldf("SELECT Keyword FROM dat WHERE Keyword like '%car%'")
#    Keyword
# 1     cars
# 2  autocar
# 3 carsinfo
# 4      car

答案 2 :(得分:2)

您还可以使用正则表达式来执行此类过滤。 grepl返回一个逻辑向量(TRUE / FALSE),表明是否存在匹配。您可以非常复杂地匹配特定项目,但在这种情况下基本查询将起作用:

#Using @Joshua's dat data.frame
subset(dat, grepl("car", Keyword, ignore.case = TRUE))

   Keyword
1     cars
2  autocar
3 carsinfo
6      car

答案 3 :(得分:0)

非常类似于@Chase提供的解决方案。因为我们不使用子集,所以我们不需要逻辑向量,可以同时使用grepgrepl

df <- data.frame(keyword = c("cars", "autocar", "carsinfo", "whatisthat", "donnadrive", "car", "telephone"))
df[grep("car", df$keyword), , drop = FALSE] # or
df[grepl("car", df$keyword), , drop = FALSE]

   keyword
1     cars
2  autocar
3 carsinfo
6      car

我从Selecting rows where a column has a string like 'hsa..' (partial string match)

接受了这个想法