Измените скрипт на функцию, чтобы его можно было зациклить. Скрипт использует mutate и str_detect для создания нового столбца фрейма данных - PullRequest
0 голосов
/ 24 июня 2019

У меня есть большой фрейм данных (462 тыс. Строк) с переменной, в которой содержится общее название лекарственного препарата. Есть тысячи разных дженериков; Меня интересует около 100 из них. У некоторых лекарств есть несколько компонентов-дженериков; Мне нужно знать, содержатся ли какие-либо лекарства, которые меня интересуют, в лекарстве. Я создал скрипт, который добавляет новую логическую переменную во фрейм данных с помощью mutate, которая имеет значение TRUE, если присутствует один из генерических препаратов, например, «ибупрофен», либо сам по себе, либо в сочетании с другими генерическими препаратами, использующими str_detect.

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

Вот сценарий, который работает, и в этом случае он найдет шаблон символов DICLOFEN в столбце фрейма данных drug_generic_name и создаст новый столбец в фрейме данных с именем Diclofenac:

Drug_Table_Names <- data.frame(mutate(Drug_Table_Names, DRUG_GENERIC_NAME, 
                                  Diclofenac = str_detect 
                                  (Drug_Table_Names$DRUG_GENERIC_NAME,"DICLOFEN", negate = FALSE)))

Я считаю, что у функции, которую я хочу, будет два аргумента: 1. Аргумент для mutate, который будет именем переменной, которую он создаст, Diclofenac в приведенном выше примере. 2. Аргумент для str_detect, чтобы обнаружить, то есть общее название препарата (или его части, в данном случае), в приведенном выше примере DICLOFEN.

У меня есть столбец с двумя столбцами, NSAID_LIST, с двумя переменными, drug_flag, который будет именем новой переменной, и gen_name, который является шаблоном, который будет искать str_detect:

# A tibble: 6 x 2
  drug_flag    gen_name    
  <chr>        <chr>       
1 Diclofenac   DICLOFENAC  
2 Fenoprofen   FENOPROFEN  
3 Flurbiprofen FLURBIPROFEN
4 Ibuprofen    IBUPROFEN   
5 Ketoprofen   KETOPROFEN  
6 Naproxen     NAPROXEN    

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   13 obs. of  2 variables:
 $ drug_flag: chr  "Diclofenac" "Fenoprofen" "Flurbiprofen" "Ibuprofen" ...
 $ gen_name : chr  "DICLOFENAC" "FENOPROFEN" "FLURBIPROFEN" "IBUPROFEN" ...

Вот моя неудачная попытка написать функцию, которую я назвал FlagDrugNames:

FlagDrugNames<-function (drug_flag, gen_name) {Drug_Table_Names <- data.frame(mutate(Drug_Table_Names, DRUG_GENERIC_NAME, 
                                     drug_flag = str_detect 
                                     (Drug_Table_Names$DRUG_GENERIC_NAME,
                                       "gen_name", negate = FALSE)))}

У меня две проблемы: Во-первых, функция не работает (или я не знаю, как ее использовать). Когда я запускаю функцию и набираю аргументы:

FlagDrugNames(Flurbiprofen, FLURBIPROFEN)

Он не добавляет новый столбец во фрейм данных, как это делает скрипт.

Второе: я бы хотел запустить эту функцию через список значений gen_name и drug_flag в таблице выше, показанной выше.

Буду признателен за помощь в написании функции, а затем в качестве эля, чтобы передать в нее пары drug_flag и gen_name.

1 Ответ

0 голосов
/ 24 июня 2019

Используя пример mtcars, может сработать что-то подобное:

find_names = function(dat, col1, string1, new_col_name) {

    mutate_call = lazyeval::interp(~ str_detect(a,string1), a = as.name(col1))

    dat %>% mutate_(.dots = setNames(list(mutate_call), new_col_name))

    return(dat)

  }

mtcars = find_names(mtcars, 'wt', '2', 'ibuprofen')

Затем вы используете цикл for

for (i in 1:nrow(dict) { find_names(mtcars,'wt',dict[i,1],dict[i,2]) }
...