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

Vin*_*ent 8 r

这是一个简单的例子.我有一个数据框,里面有三个日期:

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

现在我添加一个由相同条目组成的列:

for(i in 1:3){
  Data[i, "date2"] <- Data[i, "date"]
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

        date date2
1 1970-01-01     0
2 1970-01-02     1
3 1970-01-03     2
Run Code Online (Sandbox Code Playgroud)

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

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

它没有任何区别.

        date date2 date3
1 1970-01-01     0     0
2 1970-01-02     1     1
3 1970-01-03     2     2
Run Code Online (Sandbox Code Playgroud)

问题似乎在于使用子集[],在更有趣的例子中,你有两列日期,并希望创建第三个日期,从另外两列中的一列中选择一个日期,具体取决于同样的因素.

当然,我们可以通过执行以下操作来回顾一切:

Data$date4 <- as.Date(Data$date2, origin = "1970-01-01")
Run Code Online (Sandbox Code Playgroud)

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

ags*_*udy 6

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

在这里你的数据:

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

取这2个向量,一个默认为数字,第二个为Date.

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
Run Code Online (Sandbox Code Playgroud)

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

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"  
Run Code Online (Sandbox Code Playgroud)

如您所见,键入的向量已创建好.发生什么事,当你可以指定由标量值的向量,R尝试在内部将其转换为载体的类型.要返回到您的示例,请执行以下操作:

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

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

如果您键入date3,例如:

Data$date3 <- vv.Date
Run Code Online (Sandbox Code Playgroud)

那你再试一次

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

你会得到一个好结果:

       date      date3
1 2000-01-01 2000-01-01
2 2012-01-02 2012-01-02
3 2013-01-03 2013-01-03
Run Code Online (Sandbox Code Playgroud)

  • ...所以OP只需要在循环之前用`Data $ date2 < - as.Date(NA)`初始化列. (2认同)