2016-12-15 69 views
4

我正在努力处理一些数据操作。我的数据表中的其中一列包含出生日期,但是对于一个位置,这些值的偏差是100年。使用lubridate和if语句处理日期

我做了一个小数据框来解释我的问题:巴黎/柏林的日期是正确的,我想只改变那些以伦敦为位置的行的日期(对于这个例子从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

的日期级别被ifelse破坏...寻找为什么 –

回答

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)) 
+0

as.character在这里做的伎俩。 – EskimoT

3

ifelse走的是类从测试属性:

模式的结果可能取决于测试值(请参阅 示例),并且结果的类属性(请参见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