我在格式良好的日期之间有一些不正确的日期,看起来像这样:
df <- data.frame(col=c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05"))
如何在现有格式正确的日期之间转换不正确的格式?
我可以删除第一个破折号,但也需要删除最后3个字符-01
或-1
。因此修正后的值为:
desired <- c("1.1.11","1.1.12","1.1.13","1.1.14","1.10.10","1.10.11","1.10.12","2010-03-31","2010-04-01","2010-04-05"))
我正在扼杀的是-01
部分,因为通过删除这些部分,也会删除部分正确的格式化日期。
编辑:格式为mm.dd.yy
答案 0 :(得分:4)
使用sub
...
sub('^-+([^-]+).+', '\\1', df$col)
# [1] "1.1.11" "1.11.12" "1.1.13" "1.1.14" "1.10.10"
# [6] "1.10.11" "1.10.12" "2010-03-31" "2010-04-01" "2010-04-05"
答案 1 :(得分:3)
只需删除开头的所有非字词字符或结尾处的-01
或-1
,但前面没有-
+两位数字。
> x <- c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05")
> gsub("^\\W+|(?<!-\\d{2})-0?1$", "", x, perl=T)
[1] "1.1.11" "1.11.12" "1.1.13" "1.1.14" "1.10.10"
[6] "1.10.11" "1.10.12" "2010-03-31" "2010-04-01" "2010-04-05"
答案 2 :(得分:1)
一个简单的正则表达式可以很好地解决这些问题:
> df <- c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05")
> df
[1] "--1.1.11-01" "--1.11.12-1" "--1.1.13-01" "--1.1.14-01" "--1.10.10-01" "-1.10.11-01" "---1.10.12-01"
[8] "2010-03-31" "2010-04-01" "2010-04-05"
> df <- sub(".*([0-9]{4}\\-[0-9]{2}\\-[0-9]{2}|[0-9]{1,2}\\.[0-9]{1,2}\\.[0-9]{1,2}).*", "\\1", df)
> df
[1] "1.1.11" "1.11.12" "1.1.13" "1.1.14" "1.10.10" "1.10.11" "1.10.12" "2010-03-31" "2010-04-01"
[10] "2010-04-05"
请注意,我将其设为字符向量而不是data.frame。
解决方案本身只是匹配一个模式或另一个模式,然后通过用子模式替换它来删除其余模式。
答案 3 :(得分:0)
我在这里观察到,如果日期的前缀有一个条目为-1或--1那么只有一个非法后缀,即-01。 您可以先获取数组中的所有值。 所以你将有一个数组“--1.1.11-01”,“ - 1.11.12-1”,“ - 1.1.13-01”,“ - 1.1.14-01”,“ - 1.10.10-01" , “ - 1.10.11-01”
现在你可以检查前缀,如果它是-1或-1。如果存在任何此类事物,那么您可以将其标记为删除后缀-01。 根据上面的输入模式,我觉得上述策略可行。
如果策略有效,请告诉我