R:为什么在分组时丢失课程日期

时间:2013-07-01 14:50:59

标签: r

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

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")

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

1 个答案:

答案 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