这是一个简单的例子。我有一个数据框,其中包含三个日期:
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 的类是数字,而不是日期类。奇怪的是,如果您明确告诉 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")
但我仍然想知道:为什么?为什么会发生这种情况?为什么我的日期在转移到另一列时不能只保留日期?
最佳答案
这不是最终的解决方案,但我认为这可以帮助理解。
这是您的数据:
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
关于R:为什么类 Date 在子集化时丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17407365/