【发布时间】:2020-11-18 17:39:25
【问题描述】:
我有一些肮脏的数据需要整理。这是一个例子:
x <- "FIRST LAST Sep 1, 2020 1234567 Jan 1, 1985 555-555-5555 100 Main St. Somewhere, CA 90009 Atorvastatin Calcium Cetirizine HCl Diflucan Flonase Allergy Relief Hydrochlorothiazide HydrOXYzine Pamoate Oct 1, 2020 Sep 1, 2020 1234567 Jan 1, 1985 555-555-5555
FIRSTA LASTA Sep 12, 2020 2234567 Jan 12, 1985 555-555-5552 1002 MAIN AVE, CA 90009 DR. JOHN SMITH Cetirizine HCl Diflucan Flonase Allergy Relief Hydrochlorothiazide HydrOXYzine Pamoate Oct 12, 2020 Sep 12, 2020 2234567 Jan 12, 1985 555-555-5552 Smith REX
FIRSTB LASTB Sep 13, 2020 3234567 Jan 13, 1985 555-555-5553 1003 Main St. Somewhere, CA 90009 Cetirizine HCl Diflucan Flonase Allergy Relief Hydrochlorothiazide HydrOXYzine Pamoate Oct 13, 2020 Sep 13, 2020 3234567 Jan 13, 1985 555-555-5553 Somewhere"
我正在尝试获取一个表,其中包含单列和数据行,按第一个 - 空格 - 姓氏(全部大写,例如 FIRST LAST、FIRSTB LASTA、FIRSTB、LASTB),同时保留所述名称。我从基础 strsplit 开始,但放弃了。以下是我的 stringr 尝试:
str_split(x, "[A-Z]+ (?=[A-Z]+)")
这很接近,但我忘记了名字。
str_split(x, "(?<=[A-Z]+) (?=[A-Z]+)")
由于缺少有界最大值,这会引发错误。
预期输出:
[1] FIRST LAST Sep 1, 2020 1234567 Jan 1, 1985 555-555-5555 100 Main St. Somewhere, CA 90009 Atorvastatin Calcium Cetirizine HCl Diflucan Flonase Allergy Relief Hydrochlorothiazide HydrOXYzine Pamoate Oct 1, 2020 Sep 1, 2020 1234567 Jan 1, 1985 555-555-5555
[2] FIRSTA LASTA Sep 12, 2020 2234567 Jan 12, 1985 555-555-5552 1002 Main St. Somewhere, CA 90009 Cetirizine HCl Diflucan Flonase Allergy Relief Hydrochlorothiazide HydrOXYzine Pamoate Oct 12, 2020 Sep 12, 2020 2234567 Jan 12, 1985 555-555-5552
[3] FIRSTB LASTB Sep 13, 2020 3234567 Jan 13, 1985 555-555-5553 1003 Main St. Somewhere, CA 90009 Cetirizine HCl Diflucan Flonase Allergy Relief Hydrochlorothiazide HydrOXYzine Pamoate Oct 13, 2020 Sep 13, 2020 3234567 Jan 13, 1985 555-555-5553
【问题讨论】:
-
您的预期输出是什么?
strsplit(x, "(?<=\\d) (?=[A-Z]{3,})", perl=TRUE)能解决问题吗? -
是的 Onyambu,适用于我最初发布的示例。我的真实数据更复杂,并且不会始终以数字结尾。我已经调整了样本,使其更能代表真实数据。
-
或许你应该考虑
strsplit(x, "(?<=[^A-Z])\\s+(?=[A-Z]{3,})", perl = TRUE) -
我知道你用正则表达式去哪里了。说得通。我的数据中有一些全部大写的案例,所以我确实再次更新了样本,以防万一有人有想法。否则代码运行良好。
-
问题是你怎么知道名字和姓氏?您需要尽可能具体,以免最终在错误的位置分裂