这是一个简单的例子。我有一个包含三个日期的数据框:
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")
但我还在想:为什么?为什么会这样?为什么我的日期只能在转移到另一列时保留日期?
答案 0 :(得分:6)
这不是最终解决方案,但我认为这有助于理解。
这是您的数据:
Data <- data.frame(date =
as.Date(c('2000/01/01', '2012/01/02', '2013/01/03')))
取这两个向量,一个默认为数字,第二个为日期。
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"])
}
如果您输入日期3,例如:
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