这是一个简单的例子.我有一个数据框,里面有三个日期:
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)
但我还在想:为什么?为什么会这样?为什么我的日期只能在转移到另一列时保留日期?
这不是最终的解决方案,但我认为这有助于理解.
在这里你的数据:
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)