使用lubridate和if语句进行日期操作

时间:2016-12-15 17:20:20

标签: r date if-statement lubridate

我正在努力处理一些数据。我的数据表中的一列包含出生日期,但对于一个位置,这些值的关闭时间为100年。

我做了一个示例小数据框来解释我的问题:巴黎/柏林的日期是正确的,我想仅为伦敦作为位置的那些行更改日期(例如2028-3-25到1928年) -3-25)。

library(lubridate)
date <- as.Date(c('1950-11-1','2028-3-25','1940-3-14'))
location <- c("Paris", "London", "Berlin")
df <- data.frame(date, location)
df$date_new <- ifelse(df$location %in% c("London"), df$date - years(100), df$date)

正如你所看到的,我安装了lubridate包并尝试使用if else语句,但这只是在新列中给了我一些负数。

解决方案可能非常简单,但我无法理解,这让我疯狂。

谢谢!

2 个答案:

答案 0 :(得分:4)

尝试将此作为替代

df$date_new <- df$date
df$date_new[df$location=="London"] <- df$date_new[df$location=="London"] - years(100)

或代替df$date_new <- ifelse(df$location %in% c("London"), df$date - years(100), df$date)

尝试

df$date_new <- ifelse(df$location %in% c("London"), as.character(df$date - years(100)), as.character(df$date))

答案 1 :(得分:3)

ifelse正在从测试中获取类属性:

  

结果的模式可能取决于测试的值(参见   例子),以及结果的class属性(参见oldClass)   取自测试,可能不适合从中选择的值   是和否。

     

有时候最好使用

这样的结构      

(tmp <- yes; tmp[!test] <- no[!test]; tmp),可能扩展到   处理测试中的缺失值。

所以看起来最好不要使用ifelse。这是一个解决方案:

> df$date_new = df$date
> df[location == "London",]$date_new = df[location == "London",]$date_new - years(100)
> df
        date location   date_new
1 1950-11-01    Paris 1950-11-01
2 2028-03-25   London 1928-03-25
3 1940-03-14   Berlin 1940-03-14

但是,如果要使用ifelse,如果指定标准原点(R中的对象),则可以将对象强制转换为日期

> library(lubridate)
> date <- as.Date(c('1950-11-1','2028-3-25','1940-3-14'))
> location <- c("Paris", "London", "Berlin")
> df <- data.frame(date, location)
> df$date_new <- as.Date(ifelse(df$location == "London", as.Date(df$date - years(100)), df$date), origin = origin)
> df
        date location   date_new
1 1950-11-01    Paris 1950-11-01
2 2028-03-25   London 1928-03-25
3 1940-03-14   Berlin 1940-03-14