如何将data.frame中两个POSIXct列之一的值分配给新的POSIXct列?

时间:2016-05-06 18:51:50

标签: r dataframe posixct

我有一个带有两列POSIXct类型的data.frame,但对于每一行,只有一列会有一个值,例如

dd <- data.frame(date1 = c(now(), NA), date2 = c(as.POSIXct(NA), now()))
> dd
                date1               date2
1 2016-05-06 11:30:04                <NA>
2                <NA> 2016-05-06 11:30:04

我现在想要创建第三列,其中包含具有非NA值的列的值,即结果应该如下所示

> dd
                date1               date2               date3
1 2016-05-06 11:26:36                <NA> 2016-05-06 11:26:36
2                <NA> 2016-05-06 11:26:36 2016-05-06 11:26:36 

我尝试过使用ifelse(),但它不起作用:

> mutate(dd, date3 = ifelse(!is.na(date1), date1, date2))
                date1               date2      date3
1 2016-05-06 11:30:04                <NA> 1462559405
2                <NA> 2016-05-06 11:30:04 1462559405

基于逻辑矢量的分配也没有:

> dd[!is.na(dd$date1), "date3"] <- dd[!is.na(dd$date1), "date1"]
> dd[!is.na(dd$date2), "date3"] <- dd[!is.na(dd$date2), "date2"]
> dd
                date1               date2      date3
1 2016-05-06 11:30:04                <NA> 1462559405
2                <NA> 2016-05-06 11:30:04 1462559405

任何人都可以解释这种行为吗?

我是否一直在创建一个带有POSIXct类空列的新data.frame然后分配到它?这并不理想,因为它打破了只能分配到data.frame并让它神奇地工作的规则。

或者我应该进行分配,然后更改列类(如solution中所述)?这不是理想的,因为在赋值过程中转换为数字会丢弃时区,然后在调用as.POSIXct()时我必须再次提供时区。

提前致谢!

2 个答案:

答案 0 :(得分:1)

以下解决方案对我有用,虽然代码不是很干净:

dd<-read.csv("dd.csv",stringsAsFactors = F,na.strings = c("", " "))

dd[,1]<-as.POSIXct(dd[,1],"%m/%d/%Y %H:%M",tz = "GMT")
dd[,2]<-as.POSIXct(dd[,2],"%m/%d/%Y %H:%M",tz = "GMT")
dd[,'Date3']<-dd[,1]


dd[which(!is.na(dd$Date1)),'Date3']<-dd$Date1[!is.na(dd$Date1)]
dd[which(!is.na(dd$Date2)),'Date3']<-dd$Date2[!is.na(dd$Date2)]

str(dd)
'data.frame':   6 obs. of  3 variables:
 $ Date1: POSIXct, format: "2016-05-20 11:30:00" ...
 $ Date2: POSIXct, format: NA ...
 $ Date3: POSIXct, format: "2016-05-20 11:30:00" .

sum(is.na(dd$Date3))
[1] 0

我使用的技巧是使用Date3创建Date1,这反过来意味着列的类是POSIXct

答案 1 :(得分:0)

另一种方法是,假设date1是正确的&#39;然后用适用的date2覆盖

dd <- data.frame(date1 = c(now(), NA), date2 = c(as.POSIXct(NA), now()))
dd2 <- dd$date1
dd2[is.na(dd2)]<-dd$date2[is.na(dd2)]