R为什么ifelse()会更改数据类型

时间:2015-01-09 08:47:21

标签: r function types

在具有类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'。

0 个答案:

没有答案