如何用R筛选chr格式日期中2016年的事件?替代SQL LIKE函数
解决R中筛选2016年事件的问题
你的原代码失效是因为日期字段是完整的"YYYY-MM-DD"格式字符串,直接用== "2016"无法匹配任何完整日期值。以下是几种类似SQL LIKE功能的解决方案:
方案1:Base R的grepl函数(字符串匹配)
grepl可以实现类似SQL LIKE '2016%'的匹配效果,^2016表示以2016开头的字符串:
# 直接用逻辑向量筛选行,同时指定要保留的列 most_fatalities_2016 <- gun_violence[grepl("^2016", gun_violence$date), c("state", "city_or_county")]
注:原代码里的select =是dplyr语法,Base R子集化不需要这个参数,直接在逗号后写列名向量即可。
方案2:stringr包的str_detect函数(更直观的字符串匹配)
如果你习惯用tidyverse工具,stringr::str_detect语法更清晰:
library(stringr) most_fatalities_2016 <- gun_violence[str_detect(gun_violence$date, "^2016"), c("state", "city_or_county")]
方案3:转换日期类型后筛选(更严谨的方法)
把字符型日期转成Date类型,提取年份后匹配,这种方法能避免字符串格式异常导致的错误:
用Base R实现:
# 转成Date后提取年份字符串,再匹配 most_fatalities_2016 <- gun_violence[format(as.Date(gun_violence$date), "%Y") == "2016", c("state", "city_or_county")]
用lubridate包实现(更简洁):
library(lubridate) # 提取年份数值后匹配 most_fatalities_2016 <- gun_violence[year(as.Date(gun_violence$date)) == 2016, c("state", "city_or_county")]
方案4:用dplyr管道语法(tidyverse风格)
如果常用dplyr,这种写法更易读:
library(dplyr) library(stringr) most_fatalities_2016 <- gun_violence %>% filter(str_detect(date, "^2016")) %>% # 筛选2016年的行 select(state, city_or_county) # 保留指定列
内容的提问来源于stack exchange,提问作者William Gerstung
相关产品推荐
相关产品推荐

