data.table含日期列时替换'N/A'为NA报错求助
解决data.table中字符列'N/A'替换为NA(含日期列时避免报错)
问题背景
尝试将data.table中的字符串'N/A'替换为NA时,因表中存在日期列,直接全表替换触发类型转换报错:
Error in charToDate(x) :
character string is not in a standard unambiguous format
使用网上方案时,又因data.table语法特性触发报错:
Error in
[.data.table(*tmp*, , chcols) :
j (the 2nd argument inside [...]) is a single symbol but column name 'chcols' is not found. Perhaps you intended DT[, ..chcols]. This difference to data.frame is deliberate and explained in FAQ 1.1.
正确解决方案
方案1:修正原代码(适配data.table列名向量引用规则)
原代码的核心问题是data.table中直接在j位置使用列名向量时,需要用..前缀表示“引用上层环境的变量”,修改后代码如下:
# 筛选所有字符类型列 chcols = names(dt)[sapply(dt, is.character)] # 仅在字符列中替换'N/A'为NA dt[, ..chcols][dt[, ..chcols] == 'N/A'] = NA
方案2:data.table原生高效写法(使用.SDcols)
利用data.table专属的.SD(数据子集)和.SDcols指定目标列,直接在原表上修改,性能更优:
chcols = names(dt)[sapply(dt, is.character)] # 用基础ifelse替换 dt[, (chcols) := lapply(.SD, function(x) ifelse(x == 'N/A', NA, x)), .SDcols = chcols]
如果追求更高性能,可改用data.table内置的fifelse函数:
chcols = names(dt)[sapply(dt, is.character)] dt[, (chcols) := lapply(.SD, function(x) fifelse(x == 'N/A', NA, x)), .SDcols = chcols]
关键说明
- 两种方案均只针对字符类型列操作,完全避开日期列,从根源避免类型转换错误;
- 方案2的
(chcols) :=是data.table的原地赋值语法,无需复制整张表,比方案1的链式索引效率更高。
内容的提问来源于stack exchange,提问作者Zach Fara
相关产品推荐
相关产品推荐

