首页 > 解决方案 > 基于模式重命名变量的 sqldf R 代码

问题描述

我有一个超过 50,000 行的不同名称的 csv 格式的列表,下面有相同的底层 5 位代码:

Code             Name
25000            James John Junior
RA25000          James Junior
RA2500009        James J. Junior
RA27000          Bill Hope
RA2800009        Donna Scott
28000            Donna Love Scott

sqldf由于列表共享相同的底层代码,例如 25000,我如何使用R 中的包(如下所示)更改列表以使其名称与底层代码(例如 25000)相关联。仅使用 Rstudio。

Code             Name
25000            James John Junior
RA25000          James John Junior
RA2500009        James John Junior
RA27000          Bill Hope
RA2800009        Donna Love Scott
28000            Donna Love Scott

请注意,我想避免在代码中单独键入 25000、27000 和 28000,因为列表本身有超过 50,000 行,并且可能有 40,000 个基础代码变体。

标签: sqlrlistsqldf

解决方案


假设您的版本sqldf支持公用表表达式(SQLite 3.8.3+),请考虑使用 and 清理代码并将SUBSTRREPLACE连接到聚合 CTE 以与最大长度的名称对齐。CTE 的最终自连接需要映射干净的名称。

WITH agg AS
   (SELECT SUBSTR(REPLACE([Code], 'RA', ''),1,5) AS CleanCode, 
           MAX(LENGTH([Name])) AS MaxLenName
    FROM myData
    GROUP BY SUBSTR(REPLACE([Code], 'RA', ''),1,5)
   ),
   sub AS 
   (SELECT SUBSTR(REPLACE([Code], 'RA', ''),1,5) AS CleanCode, 
           LENGTH([Name]) AS LenName,
           [Code],
           [Name]
    FROM myData
   )

SELECT sub.Code,
       sub2.Name
FROM sub
INNER JOIN agg
   ON agg.CleanCode = sub.CleanCode
LEFT JOIN sub as sub2
   ON agg.CleanCode = sub2.CleanCode
   AND agg.MaxLenName = sub2.LenName;

Online Demo (点击顶部运行)

| Code      | Name              |
| --------- | ----------------- |
| 25000     | James John Junior |
| RA25000   | James John Junior |
| RA2500009 | James John Junior |
| RA27000   | Bill Hope         |
| RA2800009 | Donna Love Scott  |
| 28000     | Donna Love Scott  |

推荐阅读