R中按索引选列时substr出现多余字符的问题求助
R语言日期转换:列索引调用时substr返回异常字符的解决方法
问题根源
你遇到的c("前缀异常,核心原因是用[,2]提取列时,得到的是单列data.frame/tibble对象,而非原子向量。当substr作用在这类对象上时,R会将整个对象的打印文本(如c("01/01/1959", ...))转为字符串后截取,自然出现"c(\"01/01/1"这类错误结果。而$date_mes提取的是纯原子向量,因此substr能正常处理每个日期字符串。
解决方案
方案1:改用[[ ]]提取向量
将ouvrages_brut[,2]替换为ouvrages_brut[[2]],直接获取列对应的原子向量,substr即可正常工作:
ouvrages <- ouvrages_brut %>% mutate(date_mes_norme = as.Date( paste0( substr(ouvrages_brut[[2]], 7, 10), "-", substr(ouvrages_brut[[2]], 4, 5), "-", substr(ouvrages_brut[[2]], 1, 2) ) ))
方案2:用as.Date原生参数简化转换
完全不需要手动截取字符串,as.Date支持直接指定原日期格式,代码更简洁可靠:
# 列名调用写法 ouvrages <- ouvrages_brut %>% mutate(date_mes_norme = as.Date(date_mes, format = "%d/%m/%Y")) # 列索引调用写法(同样用[[提取向量) ouvrages <- ouvrages_brut %>% mutate(date_mes_norme = as.Date(ouvrages_brut[[2]], format = "%d/%m/%Y"))
方案3:封装函数的正确写法
如果要封装成按列索引处理的函数,务必确保提取的是向量:
normalize_date <- function(data, col_index) { # 若列是因子类型,先转字符 date_col <- as.character(data[[col_index]]) data %>% mutate(date_norme = as.Date(date_col, format = "%d/%m/%Y")) } # 调用示例 ouvrages <- normalize_date(ouvrages_brut, 2)
验证提示
可以先检查提取对象的类型,确认是否为向量:
class(ouvrages_brut[,2]) # 返回"data.frame"或"tbl_df"(非向量) class(ouvrages_brut[[2]]) # 返回"character"或"factor"(向量类型)
内容的提问来源于stack exchange,提问作者KoudouKurieux
相关产品推荐
相关产品推荐

