在R中,子集化(subsetting)POSIXlt和POSIXct的区别

4

数据

v1 <- c("2015-01-05 15:00:00", "2015-01-05 15:45:00", "2015-01-05 15:00:30")

运营

v2 <- strptime(v1, '%Y-%m-%d %H:%M:%S')
str(v2)
POSIXlt[1:3], format: "2015-01-05 15:00:00" "2015-01-05 15:45:00" "2015-01-05 15:00:30"

v3 <- v2[!v2$min]  # create v3 from v2 eliminating min != 00

结果(成功的子集)

str(v3)
POSIXlt[1:2], format: "2015-01-05 15:00:00" "2015-01-05 15:00:30"

现在通过将v2强制转换为POSIXct类型来创建v4(成功)

v4 <- as.POSIXct(v2, format = "%y/%m/%d  %H:%M")

str(v4)
POSIXct[1:3], format: "2015-01-05 15:00:00" "2015-01-05 15:45:00" "2015-01-05 15:00:30"

问题涉及的操作- 对POSIXct和POSIXlt应用相同的子集操作会导致下面的错误

v5 <- v4[!v4$min]  # reassign v2 eliminating min != 00

结果(错误)

  Error in v4$min : $ operator is invalid for atomic vectors

问题:
a)为什么会有这种行为差异?
b)与POSIXct一起使用的等效操作是什么?
非常感谢

1个回答

13
您误解了POSIXltPOSIXct之间的关键区别:
  • POSIXlt是一个'列表类型',您可以像访问列表一样访问其组件
  • POSIXct是一个'紧凑类型',本质上只是一个数字
您几乎总是希望使用POSIXct进行比较和有效存储(例如在data.frame中或使用它来索引zooxts对象),并且可以使用POSIXlt来访问组件。但要注意,这些组件遵循C库标准,例如当前年份为115(因为您始终需要加上1900),星期从零开始等等。
对这些变量运行str()unclass会有一定启示。由于历史原因,strptime()返回POSIXlt。我希望它能返回POSIXct

感谢您的澄清。我发现将数据格式转换为POSIXlt(通过strptime())然后再转换为POSIXct(通过as.POSIXct())更容易。目标是创建xts对象。 - jpinelo
1
是的,通过转换访问时间的一部分似乎很自然,例如从lubridate minute.default <- function(x) as.POSIXlt(x, tz = tz(x))$min - jaimedash
1
如果你在使用基本的 R 时知道该做什么,就没有必要使用 lubridate。 - Dirk Eddelbuettel
1
+1 我并不是要表达其他意思。虽然我的评论不是很清楚,但我的意图是展示 lubridate 如何使用基本的 R 函数 as.POSIXlt 来访问(或在 OP 的术语中进行子集操作)POSIXct 对象的部分内容。 - jaimedash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接