繁体   English   中英

从具有不同日期格式的字符串变量中提取 R 中的日期,显示缺乏一般结构/困难模式

[英]Extracting dates in R, from a string variable with different date formats exhibiting lack of general structure / difficult pattern

我有一列大约 1300 个字符,我需要从中提取一个日期,如果该字符包含一个日期(即如果 NA 则没有要拍摄的日期)并且如果它包含多个日期,我只需要一个; 如果它包含日期间隔,我不需要日期。

例如,这里有 10 个观察结果,最能说明不同的情况,我想作为评论得到:

string1 <- 'Eff. 1/1/96 ACWD Res #96-006 Service' # need the date
string2 <- 'NA' # irrelevant 
string3 <-'Effective 2/1/07' # need the date
string4 <- 'Effective: 3/01/2011' # need the date
string5 <- 'Eff. July 1, 1995 Ord. #92 Includes Cap Exp Ch' # need the date
string6 <- 'Effective: 2010-11' # need the date
string7 <- 'Eff. January 02' # need the date 
string8 <- 'Effective 1/1/09 Billing (svc prd 10/15 - 12/15/08)' # need first date only, not intervals
string9 <- 'Eff. 9/1/95 Resolution No. 63-95 1st 1000 g. free' # need the date
string10 <- '(svc prd 10/15-12/15/08)' # don't need interval dates

所以strings 1 & 3 & 8 & 9 (格式相同)、 string7string4string5string6具有不同的日期格式。 此外, string6string7有更多问题。 string6可以取为1/1/10 (一般取为 1/1/FIRST YEAR),而string7的年份可以用另一个字符列标识,命名为FY包含FY 9596等值,则string7可以取为1/2/95

10个字符串所需的 output 应该是:(它们也可以是YYYY-MM-DD ,只要它们一致就没有关系)

1/1/96
NULL
2/1/07
3/1/11
7/1/95
1/1/10
1/2/95
1/1/09
9/1/95
NULL

当我一次在 10 上测试它时,使用以下

for(j in 1:10){
strapplyc(string[j], "\\d+/\\d+/\\d+", simplify = TRUE)
}

由于实例日期格式的结构差异,我得到以下信息:

Error in if (nchar(s) > 0 && substring(s, 1, 1) == "\002") { : 
  missing value where TRUE/FALSE needed

特别是, string7string5string6无法返回我需要的内容,正如预期的那样,我得到NULL 此外,我得到的string8无法返回我需要的内容

      [,1]      
[1,] "1/1/09"  
[2,] "12/15/08"

最后, string10无法返回我需要的内容,而是得到12/15/08

使用ifelse对 string5 、 string5string6进行mutate的最有效方法是string7 对于string10 ,如果日期之前,我想分配 NULL -因为我认为这可能表示一个与我的目的无关的间隔,但string6包含我需要的连字符。

据我所知,我这里这里看到了一些相关的帖子。 但认为这个案例是完全不同的。 如果不是这种情况,请提前道歉。

很感谢任何形式的帮助 !!

根据@mnist 的评论和我后续评论中公认的模式,我使用grepl拆分数据(让myData表示我的数据框,让String表示所有 1300 个字符串观察的列)

myData <- myData %>% filter(grepl("Eff|eff|Ef",String))

然后我再次将myData拆分为 2 个子集,案例 1(很好的案例)对应于filter(grepl("\\d+/\\d+/\\d+", String))和案例 2 对应于filter(,grepl("\\d+/\\d+/\\d+", String))分别。 事实证明,案例 2(烦人的案例)仅占观察结果的 3%(<50 obs),我想我将手动处理,因为它并不多。

事实证明,案例 1 只有一个像string8这样的观察结果,所以我手动更正了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM