在具有类Date的列上使用 ifelse()会产生数字列。这是一个例子:
# Data
x <- data.frame(dt1 = as.Date(c('2001-01-01','2001-01-02',NA)))
x
dt1
1 2001-01-01
2 2001-01-02
3 <NA>
# Copy
x$dt2 <- x$dt1
x
dt1 dt2
1 2001-01-01 2001-01-01
2 2001-01-02 2001-01-02
3 <NA> <NA>
str(x)
'data.frame': 3 obs. of 2 variables:
$ dt1: Date, format: "2001-01-01" "2001-01-02" NA
$ dt2: Date, format: "2001-01-01" "2001-01-02" NA
复制数据类型Date的列会提供与预期相同的数据类型。但是,如果我使用 ifelse(),我会得到不同的数据类型:
x$dt3 <- with(x, ifelse(is.na(dt1),'9999-12-31',dt1))
x$dt4 <- with(x, ifelse(is.na(dt1),as.Date('9999-12-31'),dt1))
x
dt1 dt2 dt3 dt4
1 2001-01-01 2001-01-01 11323 11323
2 2001-01-02 2001-01-02 11324 11324
3 <NA> <NA> 9999-12-31 2932896
str(x)
'data.frame': 3 obs. of 4 variables:
$ dt1: Date, format: "2001-01-01" "2001-01-02" NA
$ dt2: Date, format: "2001-01-01" "2001-01-02" NA
$ dt3: chr "11323" "11324" "9999-12-31"
$ dt4: num 11323 11324 2932896
要获得预期的结果,我必须将数字版本转换为日期:
x$dt4 <- as.Date(x$dt4,origin = "1970-01-01")
x
dt1 dt2 dt3 dt4
1 2001-01-01 2001-01-01 11323 2001-01-01
2 2001-01-02 2001-01-02 11324 2001-01-02
3 <NA> <NA> 9999-12-31 9999-12-31
我只是想知道为什么会这样。似乎当函数应用于列时,它使用数值(在格式化值后面)。然后应以所需格式手动转换数字输出。如果是这种情况,由于原产地的定义,这将产生一些问题。我希望通过使用函数(例如ifelse)将Date隐式转换为数字总是被称为origin'1970-01-01'。