如何用data.table按条件修改日期变量行值?问题排查与解决
问题分析与解决:data.table修改缺失日期失败
先来看你的数据集:
data <- structure(list(producer_id = c("10005", "10005", "10007", "10007", "10007"), date = structure(c(18297, NA, 15768, 16155, NA), class = "Date")), row.names = c(NA, -5L), class = c("data.table", "data.frame"))
展示出来是这样的:
producer_id date 1: 10005 2020-02-05 2: 10005 <NA> 3: 10007 2013-03-04 4: 10007 2014-03-26 5: 10007 <NA>
你尝试的代码没生效,主要有两个关键问题:
1. 匹配条件写错了
你的代码里用了producer_id==1005,但数据集里的producer_id是字符型的"10005"——不仅数值少了一个0(应该是10005不是1005),而且字符和数字直接比较找不到任何匹配的行,自然不会修改数据。
2. 日期格式无效
你想赋值的"2020-30-12"是错误的日期格式,Date类型要求的是年-月-日,12月是第12个月,所以正确的写法应该是"2020-12-30",否则即使条件对了,这个无效日期也会被解析成NA,达不到修改目的。
另外补充一个小细节:setDT()是直接修改原对象的,不需要再赋值给data,写成setDT(data)就足够了,不用data <- setDT(data)。
正确的data.table解法
用下面的代码就能高效完成修改:
# 转换为data.table(如果还不是的话) setDT(data) # 精准匹配+赋值有效日期 data[producer_id == "10005" & is.na(date), date := as.Date("2020-12-30")]
运行后再查看数据,producer_id为10005的那行缺失日期就会变成2020-12-30,其他数据保持不变。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

