sqldf R код, который переименовывает переменные на основе шаблона - PullRequest
0 голосов
/ 05 марта 2020

У меня есть список из более чем 50 000 строк в формате csv с разными именами с одним и тем же базовым кодом 5 di git ниже:

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

Поскольку в списке используется один и тот же базовый код, например 25000 Как я могу изменить список, чтобы имя ассоциировалось с этим базовым кодом (например, 25000), используя пакет sqldf в R (как показано ниже). Используя только 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, поскольку сам список содержит более 50000 строк и, возможно, 40000 вариантов базового кода.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Используя вход, воспроизводимый в примечании в конце, выполните самостоятельное соединение слева. ltrim удаляет любые A или R в левой части кода первого экземпляра DF, а затем substr принимает следующие 5 символов. Сопоставьте это со вторым экземпляром DF s Code. Если перед именем стоят другие буквы, включите их в строку AR. Если могут появиться какие-либо заглавные буквы, тогда используйте ABCDEFGHIJKLMNOPQRSTUVWXYZ.

library(sqldf)
sqldf("select a.Code, coalesce(b.Name, a.Name) Name 
  from DF a left join DF b
  on substr(ltrim(a.Code, 'AR'), 1, 5) = b.Code")

, давая:

       Code              Name
1     25000 James John Junior
2   RA25000 James John Junior
3 RA2500009 James John Junior
4   RA27000         Bill Hope
5 RA2800009  Donna Love Scott
6     28000  Donna Love Scott

Примечание

Lines <- "Code             Name
25000            James John Junior
RA25000          James Junior
RA2500009        James J. Junior
RA27000          Bill Hope
RA2800009        Donna Scott
28000            Donna Love Scott"
Lines2 <- readLines(textConnection(Lines))
DF <- read.csv(text = sub(" +", ",", Lines2), header = TRUE, strip.white = TRUE)
0 голосов
/ 05 марта 2020

Если ваша версия sqldf поддерживает общие табличные выражения (SQLite 3.8.3+), рассмотрите возможность очистки Code с помощью SUBSTR и REPLACE и присоедините его к агрегированный 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;

Онлайн-демонстрация (нажмите «Выполнить сверху»)

| 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  |
...