我有一个带有两列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()时我必须再次提供时区。
提前致谢!
答案 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)]