R-日期时间变量在ifelse后失去格式

4

我有一个变量,使用ymd_hms(DateTime) {lubridate}转换成正确的POSIXct格式。但是,在进行变换后,该变量失去了其POSIXct格式:

daily$DateTime<- ifelse(daily$ID %in% "r1_1"|daily$ID %in% "r1_2", 
                   NA,daily$DateTime)

我尝试使用lubridate再次将变量转换为POSIXct格式,但似乎它不喜欢NA。此外,现在DateTime变量具有一个num格式,lubridate不能识别其为日期和时间格式(例如1377419400)。
请问如何将ID等于r1_1和r1_2时的DateTime转换为NA?需要转换的方法怎样?
谢谢。

https://dev59.com/oGw15IYBdhLWcg3wWqZ0 - M--
2个回答

2

设置 NA 值的惯用方式是使用 is.na<-,大多数类别(包括日期)将被适当处理。

 is.na(daily$DateTime) <- daily$ID %in% c('r1_1', 'r1_2')

应该能解决问题。

使用 ?as.POSIXct 的示例。

  ## SPSS dates (R-help 2006-02-16)
z <- c(10485849600, 10477641600, 10561104000, 10562745600)
zz <- as.POSIXct(z, origin = "1582-10-14", tz = "GMT")

is.na(zz) <- c(FALSE, TRUE, FALSE, FALSE)
zz
# [1] "1915-01-26 GMT" NA               "1917-06-15 GMT" "1917-07-04 GMT"

3
约翰·钱伯斯(John Chambers)表示,使用 is.na() 函数设置缺失值的“惯用”方式是不好的。如果你把向量 x 中一些 NA 元素设置为非 NA 值,会发生什么?结果很奇怪——你将 is.na(x) 设为 FALSE,但 is.na(x) 仍然为 TRUE。因此,我认为唯一合理的将某个值设置为 NA 的方法是使用 x <- NA,而不是使用 is.na(x) <- TRUE。前者更简洁。 - lebatsnok

2
以下方法应该可行:
daily <- data.frame(DateTime = seq(Sys.time(), length.out=10, by=1000), ID=rep(1:2,5))
daily$DateTime[daily$ID%in%2]<-NA

虽然使用is.na<-的解决方案也可以。但是设置is.na的一般逻辑并没有太多意义-只要确保事情不会变得太复杂,这就没有问题了。

ifelse进行一些隐式转换,因此我认为使用ifelse永远不可能保留日期类。


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