我正在努力处理一些数据。我的数据表中的一列包含出生日期,但对于一个位置,这些值的关闭时间为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语句,但这只是在新列中给了我一些负数。
解决方案可能非常简单,但我无法理解,这让我疯狂。
谢谢!
答案 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