gpt4 book ai didi

r - ifelse()从时间戳向量中剥离POSIXct属性?

转载 作者:行者123 更新时间:2023-12-04 07:52:35 27 4
gpt4 key购买 nike

这很奇怪:R的ifelse()似乎做了一些(不需要的)强制转换:
可以说我有一个时间戳向量(可能是NA),并且NA值应与现有日期区别对待,例如,只需忽略即可:

formatString = "%Y-%m-%d %H:%M:%OS"
timestamp = c(as.POSIXct(strptime("2000-01-01 12:00:00.000000", formatString)) + (1:3)*30, NA)

现在
timestamp
#[1] "2000-01-01 12:00:30 CET" "2000-01-01 12:01:00 CET" "2000-01-01 12:01:30 CET"
#[6] NA

根据需要,但翻译30秒会导致
ifelse(is.na(timestamp), NA, timestamp+30)
#[1] 946724460 946724490 946724520 NA

请注意, timestamp+30仍然可以按预期工作,但是可以说我想将NA日期替换为固定日期,并将所有其他日期转换30秒:
fixedDate = as.POSIXct(strptime("2000-01-01 12:00:00.000000", formatString))
ifelse(is.na(timestamp), fixedDate, timestamp+30)
#[1] 946724460 946724490 946724520 946724400

问题:此解决方案有什么问题,为什么它不能按预期工作?

编辑:所需的输出是由30秒转换的时间戳(不是整数)的向量,并且NA被替换为任何内容...

最佳答案

如果您查看ifelse的编写方式,则其中的一段代码如下所示:

ans <- test
ok <- !(nas <- is.na(test))
if (any(test[ok]))
ans[test & ok] <- rep(yes, length.out = length(ans))[test & ok]

请注意,答案从逻辑上开始,与测试相同。然后将具有 test == TRUE的元素分配给 yes的值。

那么,这里的问题是将一个逻辑向量的一个或多个元素分配为POSIX.ct类的日期会发生什么。您可以查看执行以下操作会发生什么:
x <- c(TRUE, FALSE)
class(x)
# logical
x[1] <- Sys.time()
class(x)
# numeric

您可以通过编写以下内容解决此问题:
timestamp <- timestamp + 30
timestamp[is.na(timestamp)] <- fixedDate

您也可以这样做:
fixedDate = as.POSIXct(strptime("2000-01-01 12:00:00.000000", formatString))
unlist(ifelse(is.na(timestamp), as.list(fixedDate), as.list(timestamp+30)))

这利用了替换运算符 [<-处理右侧列表的方式。

您也可以像这样重新添加class属性:
x <- ifelse(is.na(timestamp), fixedDate, timestamp+30)
class(x) <- c("POSIXct", "POSIXt")

或者,如果您迫不及待地想像这样一行:
`class<-`(ifelse(is.na(timestamp), fixedDate, timestamp+30), c("POSIXct", "POSIXt"))

或通过复制 fixedDate的属性:
x <- ifelse(is.na(timestamp), fixedDate, timestamp+30)
attributes(x) <- attributes(fixedDate)

最后一个版本的优点是也可以复制 tzone属性。

从dplyr 0.5.0开始,您还可以使用 dplyr::if_else 保留输出中的类,并为true和false参数强制执行相同的类。

关于r - ifelse()从时间戳向量中剥离POSIXct属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31133382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com