Как векторизовать итерацию по строкам табличных данных - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть набор табличных данных, который читается из файла в качестве кадра данных.Порядок строк не имеет значения.В данных нет ни одного столбца, который бы служил уникальным идентификатором этой строки, но три или четыре столбца можно было бы объединить, чтобы создать уникальный идентификатор для каждого элемента в этом файле.

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

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

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

#input: line_item a single row from a dataframe with named columns
#output: a string
map_line_item_to_asset_class <- function(line_item){

  commodity <-  c('PHYSICAL INDEX FUTURE', 'PHYSICAL COMMODITY FUTURE','FINANCIAL COMMODITY FUTURE')
  equity <- c('ADR','COMMON STOCK', 'PFD', 'ETP', 'UNIT','REIT','EQUITY INDEX','EQUITY OPTION')
  fixed_income = c('ABS', 'CORP','SOVEREIGN DEBT','MUNI')
  other <- c('CASH')
  etp_fi_overrides <- c('EMLC')        

  asset_class <- line_item$INVESTMENT.TYPE
  if(line_item$INVESTMENT.TYPE %in% equity){
    asset_class <-'EQUITY'

    if(line_item$INVESTMENT %in% etp_fi_overrides)
      asset_class <- 'FIXED INCOME'
  } else{
    if(line_item$INVESTMENT.TYPE %in% fixed_income){
      asset_class <- 'FIXED INCOME'
    } else {
      if(line_item$INVESTMENT.TYPE %in% other) asset_class <- 'OTHER'
    } 
  }
  return(asset_class)
}

Я знаю, что мог бы сделать это сby () или с простым C-подобным циклом for, используя nrow ().Вот как я это делаю сейчас.Я хотел бы знать, как, если вообще, я смог бы векторизовать эту операцию.Я знаю, что векторизация, как правило, предпочтительнее, чем итерация цикла, но я действительно не знаю, как процесс векторизации чего-то действительно работает, я все время вижу слово, и люди говорят другим делать это, но я неНе вижу примеров того, как выйти из стековых функций, которые уже это делают.Обратите внимание, что я хочу научиться векторизовать это как учебное упражнение.Я полностью осознаю, что разница во времени ЦП может быть незначительной во время настенных часов, и что я могу воспроизвести чистый вид с помощью применений.Я хочу знать, если и как это векторизовать конкретно, потому что это простое упражнение, и я хотел бы, как правильно это делать, когда время процессора или память do имеют значение.Поэтому, если вы скажете мне просто использовать цикл for или просто использовать одно из применений, это не поможет.(Я также знаю о vectorize () и знаю, что это также просто синтаксическая конфета).

...