R: Если имя включает указанный c текст, то сгруппируйте его - PullRequest
1 голос
/ 11 февраля 2020

Я использую данные сертификата энергетической эффективности для определения типов топлива для отопления зданий в этом районе, однако они разбиты на более чем 60 различных поднаборов из 9 основных видов топлива. Я хотел бы добавить еще один столбец для типа топлива, чтобы их можно было сгруппировать по 9 основным типам топлива.

Пример соответствующих столбцов данных:

BuildingID <- c(1,2,3,4,5,6,7,8,9,10)

MainHeatDesc <- c("Boiler and radiators, mains gas", "Boiler and radiators, oil", "Room heaters, electric", "Room heaters, LPG", "Air source heat pump, underfloor heating, electric", "Air source heat pump, fan coil units, electric", "Ground source heat pump, mains gas", "Electric storage heaters", "Room heaters, wood logs", "Boilers and radiators, wood chips")

data <- data.frame(BuildingID, MainHeatDesc)

Это Небольшой пример с некоторыми подмножествами исходных данных. В этом примере я хотел бы создать еще один столбец для основного типа топлива, сгруппировав их по следующим параметрам: сетевой газ, нефть, электричество c, сжиженный нефтяной газ и древесина.

Конечный результат должен выглядеть следующим образом:

# BuildingID            MainHeatDesc                             MainFuelType
#     1       Boiler and radiators, mains gas                      Mains gas
#     2       Boiler and radiators, oil                              Oil
#     3       Room heaters, electric                               Electric
#     4       Room heaters, LPG                                      LPG 
#     5       Air source heat pump, underfloor heating, electric   Electric
#     6       Air source heat pump, fan coil units, electric       Electric
#     7       Ground source heat pump, mains gas                   Mains Gas
#     8       Electric storage heaters                             Electric
#     9       Room heaters, wood logs                                Wood
#    10       Boilers and radiators, wood chips                      Wood

Если кто-нибудь сможет мне помочь, это будет с благодарностью. Дайте мне знать, если у вас есть какие-либо вопросы или вам нужна дополнительная информация.

Спасибо!

Ответы [ 3 ]

1 голос
/ 11 февраля 2020

Логотип c аналогичен @tmfmnk, но в базе R используется sub.

types <- c('Mains Gas', 'Oil', 'Electric', 'LPG', 'Wood')
data$MainFuelType <- sub(paste0(".*(?i)(", paste0("\\b", types, "\\b", 
                        collapse = "|"), ").*"), "\\1", data$MainHeatDesc)

data
#   BuildingID                                       MainHeatDesc MainFuelType
#1           1                    Boiler and radiators, mains gas    mains gas
#2           2                          Boiler and radiators, oil          oil
#3           3                             Room heaters, electric     electric
#4           4                                  Room heaters, LPG          LPG
#5           5 Air source heat pump, underfloor heating, electric     electric
#6           6     Air source heat pump, fan coil units, electric     electric
#7           7                 Ground source heat pump, mains gas    mains gas
#8           8                           Electric storage heaters     Electric
#9           9                            Room heaters, wood logs         wood
#10         10                  Boilers and radiators, wood chips         wood

, где регулярное выражение, которое генерируется динамически, выглядит следующим образом:

paste0(".*(?i)(", paste0("\\b", types, "\\b", collapse = "|"), ").*")
#[1] ".*(?i)(\\bMains Gas\\b|\\bOil\\b|\\bElectric\\b|\\bLPG\\b|\\bWood\\b).*"

, где (?i) для нечувствительности к регистру.

1 голос
/ 11 февраля 2020

Один dplyr и stringr параметр может быть:

data %>%
 mutate(group = str_extract(MainHeatDesc, regex("\\bMains gas|\\bOil|\\bElectric|\\bLPG|\\bwood", ignore_case = TRUE)))

   BuildingID                                       MainHeatDesc     group
1           1                    Boiler and radiators, mains gas mains gas
2           2                          Boiler and radiators, oil       oil
3           3                             Room heaters, electric  electric
4           4                                  Room heaters, LPG       LPG
5           5 Air source heat pump, underfloor heating, electric  electric
6           6     Air source heat pump, fan coil units, electric  electric
7           7                 Ground source heat pump, mains gas mains gas
8           8                           Electric storage heaters  Electric
9           9                            Room heaters, wood logs      wood
10         10                  Boilers and radiators, wood chips      wood

Если у вас много шаблонов, вы можете подготовить его следующим образом:

x <- paste(paste0("\\b", c("Mains gas", "Oil", "Electric", "LPG", "wood"), "\\b"), collapse = "|")

data %>%
 mutate(group = str_extract(MainHeatDesc, regex(x, ignore_case = TRUE)))

Если вы хотите в дальнейшем соответствовать ожидаемому результату, тогда вы можете использовать вектор замены:

y <- c("Mains gas", "Oil", "Electric", "LPG", "Wood")

data %>%
 mutate(group = str_extract(MainHeatDesc, regex(x, ignore_case = TRUE)),
        group = str_replace(group, regex(x, ignore_case = TRUE), y))

   BuildingID                                       MainHeatDesc     group
1           1                    Boiler and radiators, mains gas Mains gas
2           2                          Boiler and radiators, oil       Oil
3           3                             Room heaters, electric  Electric
4           4                                  Room heaters, LPG       LPG
5           5 Air source heat pump, underfloor heating, electric      Wood
6           6     Air source heat pump, fan coil units, electric Mains gas
7           7                 Ground source heat pump, mains gas       Oil
8           8                           Electric storage heaters  Electric
9           9                            Room heaters, wood logs       LPG
10         10                  Boilers and radiators, wood chips      Wood
0 голосов
/ 11 февраля 2020

Другой метод - использование вложенных операторов ifelse и grepl, соответствующих шаблону регулярного выражения:

data$MainFuelType <- ifelse(grepl("mains gas", data$MainHeatDesc), "Mains gas",
                        ifelse(grepl("\\boil", data$MainHeatDesc), "Oil",
                               ifelse(grepl("(e|E)lectric", data$MainHeatDesc), "Electric",
                                      ifelse(grepl("LPG", data$MainHeatDesc), "LPG", "Wood"))))

Результат:

data
   BuildingID                                       MainHeatDesc MainFuelType
1           1                    Boiler and radiators, mains gas    Mains gas
2           2                          Boiler and radiators, oil          Oil
3           3                             Room heaters, electric     Electric
4           4                                  Room heaters, LPG          LPG
5           5 Air source heat pump, underfloor heating, electric     Electric
6           6     Air source heat pump, fan coil units, electric     Electric
7           7                 Ground source heat pump, mains gas    Mains gas
8           8                           Electric storage heaters     Electric
9           9                            Room heaters, wood logs         Wood
10         10                  Boilers and radiators, wood chips         Wood
...