r - 有条件地更改 dplyr 链中日期的年份部分

标签 r date dataframe

x <- structure(list(SU_BIRTH_DATE = structure(c(47482, 2884, 11347, 
10449, -1280, 2324), class = "Date")), row.names = c(NA, 6L), class = "data.frame", .Names = "SU_BIRTH_DATE")

 x
  SU_BIRTH_DATE
1    2100-01-01
2    1977-11-24
3    2001-01-25
4    1998-08-11
5    1966-07-01
6    1976-05-13

通过查看数据集,可以明显看出许多人在出生日期方面使用了拼写错误,他们在年份部分输入了 2100,而不是 2001。

我想将日期字段中任何 2100 年的部分替换为 2001 年。

我怎样才能做到这一点?

x <- x %>% 
  mutate(SU_BIRTH_DATE = if_else(year(SU_BIRTH_DATE) == 2100, year(SU_BIRTH_DATE) = 2001,SU_BIRTH_DATE))

Error: unexpected '=' in: "x <- x %>% mutate(SU_BIRTH_DATE = if_else(year(SU_BIRTH_DATE) == 2100, year(SU_BIRTH_DATE) ="

编辑 转换为字符并使用 str_replace,然后转换回日期是一个同时有效的解决方案,但我确信有一种更智能、代码更少的方法可以做到这一点?

   x <- x %>% mutate(SU_BIRTH_DATE = str_replace_all(as.character(SU_BIRTH_DATE), "2100", "2001"),
              SU_BIRTH_DATE = ymd(SU_BIRTH_DATE))

最佳答案

您可以使用 gsub"2100" 替换为 "2001",然后将结果转换为 as.Date.

x %>% mutate(SU_BIRTH_DATE = as.Date(gsub("2100", "2001", SU_BIRTH_DATE)));
#  SU_BIRTH_DATE
#1    2001-01-01
#2    1977-11-24
#3    2001-01-25
#4    1998-08-11
#5    1966-07-01
#6    1976-05-13

我承认,这与您的 str_replace_all 方法类似,尽管更短一些。

关于r - 有条件地更改 dplyr 链中日期的年份部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49461627/

相关文章:

arrays - 将 R 数组列表与暗淡名称绑定(bind)在一起?

css - 将背景图像添加到 Shiny NavBarPage

java - Java 中的日期和日历(输入字符串)转换和操作

javascript - 如何在保持格式的同时将此日期转换为字符串?

apache-spark - 如何使用列的平均值将列添加到 DataFrame

python - 为什么 pandas.read_fwf 没有按照指示跳过空行?

python - 在 Pandas 数据框中的每一列上应用函数

r - 无法在 Redhat 上的 R 3.4.2 中安装 stringi 包

R 通过任意点绘制(abline + lm)最佳拟合线

java - 如何计算新的日期? - 使用一个日期变量和一个 int 变量