在data.table中使用列索引替代列名及报错解决
解决data.table按列索引替代列名时的运算报错问题
报错原因
你用.SD[,1]提取的是单列data.table对象,而非POSIXct类型的向量。当尝试将其与数值向量c(-3600, 3600)相加时,无法触发POSIXct与数值的时间偏移运算,导致后续range返回的结果不符合round的参数要求,从而抛出“非数值参数”的错误。
正确实现方式
方式1:用.SD[[1]]提取列向量
将.SD[,1]改为.SD[[1]],[[运算符会直接提取列对应的向量(而非data.table对象),确保能正常进行时间偏移运算:
date_range <- one[, round(range(.SD[[1]] + c(-3600, 3600)), unit = "hours")]
方式2:直接提取第一列向量(更简洁)
无需借助.SD,直接用one[[1]]提取第一列的POSIXct向量,代码更简洁直观:
date_range <- round(range(one[[1]] + c(-3600, 3600)), unit = "hours")
验证示例
假设你的测试数据如下:
library(data.table) one <- data.table(`Timestamp (America/New York)` = as.POSIXct( c("2024-01-01 10:00:00", "2024-01-02 14:30:00"), tz = "America/New York" ))
运行上述两种写法,都会得到和原列名代码一致的结果:
# 输出:"2024-01-01 09:00:00 EST" "2024-01-02 15:00:00 EST"
内容的提问来源于stack exchange,提问作者Golem
相关产品推荐
相关产品推荐

