8

这是一个简单的例子。我有一个包含三个日期的数据框:

Data <- as.data.frame(as.Date(c('1970/01/01', '1970/01/02', '1970/01/03')))
names(Data) <- "date"

现在我添加一个包含相同条目的列:

for(i in 1:3){
  Data[i, "date2"] <- Data[i, "date"]
}

输出如下所示:

        date date2
1 1970-01-01     0
2 1970-01-02     1
3 1970-01-03     2

由于未知原因,列 date2 的类别是数字,而不是日期类别的 date。奇怪的是,如果您明确告诉 R 使用日期格式:

for(i in 1:3){
  Data[i, "date3"] <- as.Date(Data[i, "date"])
}

它没有任何区别。

        date date2 date3
1 1970-01-01     0     0
2 1970-01-02     1     1
3 1970-01-03     2     2

问题似乎在于子集 [] 的使用,在更有趣的示例中,您有两列日期并希望创建第三列,该第三列根据某些因素从其他两列之一中选择日期。

当然,我们可以通过执行以下操作来解决所有问题:

Data$date4 <- as.Date(Data$date2, origin = "1970-01-01")

但我仍然想知道:为什么?为什么会这样?为什么我的日期在转移到另一列时不能只保留日期?

4

1 回答 1

6

这不是最终的解决方案,但我认为这有助于理解。

你的数据在这里:

Data <- data.frame(date = 
                  as.Date(c('2000/01/01', '2012/01/02', '2013/01/03')))

取这 2 个向量,一个默认输入为数字,第二个输入为日期。

vv <- vector("numeric",3)
vv.Date <- vector("numeric",3)
class(vv.Date) <- 'Date'
vv
[1] 0 0 0
> vv.Date
[1] "1970-01-01" "1970-01-01" "1970-01-01" ## type dates is initialized by the origin 01-01-1970

现在,如果我尝试像在循环的第一步中那样分配每个向量的第一个元素:

vv[1] <- Data$date[1]
vv.Date[1] <- Data$date[1]
vv
[1] 10957     0     0
> vv.Date
[1] "2000-01-01" "1970-01-01" "1970-01-01"  

如您所见,类型化向量创建良好。会发生什么,当您通过标量值分配向量时,R 会尝试在内部将其转换为向量的类型。回到你的例子,当你这样做时:

您创建了一个数字向量 (vv),并尝试为其分配日期:

for(i in 1:3){
  Data[i, "date3"] <- as.Date(Data[i, "date"])
}

如果您键入 date3 ,例如:

Data$date3 <- vv.Date

然后你再试一次

for(i in 1:3){
  Data[i, "date3"] <- as.Date(Data[i, "date"])
}

你会得到一个很好的结果:

       date      date3
1 2000-01-01 2000-01-01
2 2012-01-02 2012-01-02
3 2013-01-03 2013-01-03
于 2013-07-01T15:20:53.323 回答