Что является более эффективным способом решения длинных «else if» операторов в R? - PullRequest
0 голосов
/ 08 февраля 2019

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

Справочная информация

Используя устаревший код с другого языка, я автоматизирую отчетностьпроцесс для большого проекта.В этом проекте у меня есть несколько «Центров» для создания отчетов на основе подмножеств базы данных.Прямо сейчас я выполняю это, используя длинный цикл выборки, подобный показанному ниже:

df$ReportName <- 0

df$new_centername[is.na(df$new_centername)] <- 0

for (i in 1:nrow(df)){
  if (df$new_centername[i] == 1){
    df$ReportName[i] <- "Center A"
  } else if (df$new_centername[i] == 2){
    df$ReportName[i] <- "Center B"
  } else if (df$new_centername[i] == 3){
    df$ReportName[i] <- "Center C"
  } else if (df$new_centername[i] == 4){
    df$ReportName[i] <- "Center D"
  } else if (df$new_centername[i] == 5){
    df$ReportName[i] <- "Center E"
  } else if (df$new_centername[i] == 6){
    df$ReportName[i] <- "Center F"
  } 
  ...

df - общий фрейм данных, new_centername обозначает, к какому центру относится строка данных, все из которых кодируются численно.

Со временем я ожидаю, что к этому будет добавлено больше Центров.Я предполагаю, что есть способ сохранить эти Центры в списке, а затем создать цикл, который перебирает список.Таким образом, по мере добавления новых Центров мне нужно только добавить их имя в список.

Редактировать:

  • "Центр __" - это только заполнитель, которым можно поделиться здесь, фактические названия центров сильно различаются.
  • Числовой идентификатор также не следует прямолинейному шаблону.

Предлагаемое решение:

SampleList <- list("Center A", "Center B", "Center C", ...)

for (i in 1:nrow(df)){
  for (j in 1:length(SampleList)){
    if (df$new_centername[i] == 1){
      df$ReportName[i] <- SampleList[j]
    }
  }
}

Помогите обернуть мою голову наилучшей и подходящей логикойСинтаксис для оптимизации приветствуется! Спасибо

1 Ответ

0 голосов
/ 08 февраля 2019

Основываясь на показанном коде, мы можем сделать это напрямую, предполагая, что значения в 'new_centername' - это последовательность, начинающаяся с 1, которую можно использовать как индекс для заполнения других значений.Ниже мы создаем строковый вектор с paste0 таким образом, чтобы «Центр A» заменял или получал позицию, где «new_centername» равно 1, «Центр B», 2 и т. Д. Просто для демонстрации концепции,создали только до «Центр F».

df$new_centername <- paste0("Center ", LETTERS[1:6])[df$new_centername]

Поскольку ОП упоминала об отсутствии шаблона в значениях замены, и индекс также отличается, то эффективный подход (также предложенный в комментариях @JasonAizkalns) будет создать набор данных ключ / val, а затем объединить с исходными данными

keyval <- data.frame(key = c(5, 12, 13, 25), 
                     val = c('ASD', 'BDF', 'ANF', 'SDT'), stringsAsFactors = FALSE)
library(data.table)
setDT(df)[keyval, new_name := val, on = .(new_center_name = key)]
df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...