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
答案 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提供的解决方案。因为我们不使用子集,所以我们不需要逻辑向量,可以同时使用grep
或grepl
:
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)
接受了这个想法