R中的ifelse避免更改日期格式

3

我正在尝试为两个日期编写ifelse语句。我有两列 - DateIn和DateOut。我需要添加第三个变量,如果存在日期值,则显示“DateOut”,否则显示“DateIn”:

DateIn     DateOut     Travel date
2010-11-24 <NA>        2010-11-24
2011-12-21 2012-01-21  2012-01-21
2010-10-25 2010-11-25  2010-11-25
2014-01-14 <NA>        2014-01-14

我试图使用以下方式实现此目标:

TravelDate <- ifelse(is.na(DateIn), DateOut, DateIn)

但我得到的结果是:
    DateIn     DateOut     Travel date
2010-11-24 <NA>            15018
2011-12-21 2012-01-21      15151
2010-10-25 2010-11-25      14972
2014-01-14 <NA>            14972

出行日期被归类为“逻辑型”

有没有不使用 R 将日期转换为数字就能实现结果的方法呢?

非常感谢!


这是因为ifelse返回一个与测试相同类别的向量(在本例中,由于is.na(DateIn)返回逻辑向量,因此返回逻辑向量)。 - jbaums
3个回答

5

如果dat是数据集。我认为这是从旅行日期列中的 DateOut 导致的 is.na(DateOut)

 as.Date(with(dat, ifelse(is.na(DateOut), DateIn, DateOut)),origin="1970-01-01")
#[1] "2010-11-24" "2012-01-21" "2010-11-25" "2014-01-14"

或者您可以这样做:

 dat$Travel.date <- dat$DateOut
 dat$Travel.date[is.na(dat$Travel.date)] <- dat$DateIn[is.na(dat$Travel.date)]
  dat
 #      DateIn    DateOut Travel.date
 #1 2010-11-24       <NA>  2010-11-24
 #2 2011-12-21 2012-01-21  2012-01-21
 #3 2010-10-25 2010-11-25  2010-11-25
 #4 2014-01-14       <NA>  2014-01-14

非常感谢!它的工作效果就像我想象的一样! - user3577904

1
DateOut 赋值给 Travel.date,然后对于 DateOut 中的 NA 组件,使用 replace 将其替换为 DateIn
DF2 <- transform(DF, Travel.date = DateOut)
isna <- is.na(DF2$DateOut)
transform(DF2, Travel.date = replace(Travel.date, isna, DateIn[isna]))

我们假设这是测试数据:

DF <- structure(list(DateIn = structure(c(14937, 15329, 14907, 16084
), class = "Date"), DateOut = structure(c(NA, 15360, 14938, NA
), class = "Date"), Travel.date = structure(c(NA, 15360, 14938, 
NA), class = "Date")), .Names = c("DateIn", "DateOut", "Travel.date"
), row.names = c(NA, -4L), class = "data.frame")

0
假设这个在一个名为 'dat' 的数据框里。我猜你正在使用 'attach',我建议你放弃这种错误的方法,因为它会经常让你陷入困境,并且节约的打字时间会被混乱所浪费。相反,修改你正在使用的代码将是相当容易的:
dat$TravelDate <- as.Date( with(dat, 
                    ifelse(is.na(DateIn), DateOut, DateIn)), origin="1970-01-01")
dat
      DateIn    DateOut Travel_date TravelDate
1 2010-11-24       <NA>  2010-11-24 2010-11-24
2 2011-12-21 2012-01-21  2012-01-21 2011-12-21
3 2010-10-25 2010-11-25  2010-11-25 2010-10-25
4 2014-01-14       <NA>  2014-01-14 2014-01-14

数据测试用例。请注意,列名中的空格已被删除:

 dat<- read.table(textConnection("DateIn     DateOut     Travel_date
 2010-11-24 NA        2010-11-24
 2011-12-21 2012-01-21  2012-01-21
 2010-10-25 2010-11-25  2010-11-25
 2014-01-14 NA        2014-01-14"), header=TRUE, colClasses="Date")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接