В качестве первого шага я бы импортировал все данные о наркотиках из вашего скрипта Stata (при условии, что данные уже не в чистом, пригодном для использования формате):
drug_class_data <- read.table("Desktop/stata_script", header=FALSE, sep='"',stringsAsFactors = FALSE)
drug_class_data <-drug_class_data[,c(2,4)]
colnames(drug_class_data) <- c('Drug_class','Drug')
Удалить трейлинг * - используется в качестве символа подстановки в скрипте Stata
drug_class_data$Drug = gsub("\\*", "", drug_class_data$Drug)
Это дает вам фрейм данных с 2 столбцами ('Drug_class' & 'Drug') - строка извлекает любые данные в кавычках из каждой строки скрипта Stata (выделено жирным шрифтом ниже):
replace class = " ACE Inhibitor ", если strmatch (верхний (препарат), " CAPTOPRIL *")
Я бы затем сохранил это как файл, который затем можно будет импортировать по мере необходимости (я предполагаю, что эти данные еще не доступны, как это, поскольку вы жестко закодировали все эти значения в примере Stata).
write.csv(drug_class_data, file = "drug_class_data.csv",row.names=FALSE)
Оттуда зависит, хотите ли вы:
1) Несколько строк для каждого экземпляра препарата с одним текстовым столбцом, где класс препарата указан явно. Количество рядов на препарат = количество классов наркотиков, членом которых он является. У этого подхода есть некоторые преимущества, но он приводит к большому количеству дублированных данных.
2) Одна строка для каждого лекарственного средства и несколько логических столбцов для каждого класса лекарств - «Ингибитор АПФ», «Препарат от угревой сыпи» и т. Д. - содержащие двоичный ИСТИНА или ЛОЖЬ, чтобы указать, является ли он членом этого класса.
Лично я предпочел бы вариант 2 в качестве отправной точки для последующего анализа. (Поскольку вы упоминаете, что наркотики могут быть отнесены к нескольким классам, также несколько классов наркотиков выглядят иерархически - «Анестетик, местный» может быть родительским термином для «Анестетик, местный / антиаритмический», «Анестетик, местный / антисептик» и т. Д.)
Извлеките все уникальные классы лекарств из вашего фрейма данных в список:
drug_class_list <- unique(drug_class_data[,1])
Затем я использовал бы уродливый код ниже для создания нового кадра данных:
create_flat_table <- function(df_drugs, df_classes){
# Extract list of drug classes present in df
class_list <- unique(df_classes[,1])
# Reiterate over this list creating a new column in the drug df and populating it with data
drugs <- as.list(drug_data['drug'])
results <- df_drugs
for(class in class_list){
class_drugs <- df_classes[df_classes$Drug_class == class,]
boolean_list <- toupper(df_drugs[,2])%in%class_drugs[,2]
results <- cbind(results, boolean_list ) }
colnames(results) <- c(colnames(df_drugs), class_list)
return(results) }
combined_df <- create_flat_table(drug_data, drug_class_data)
Полученный кадр данных будет выглядеть так:
Обратите внимание, что в этом примере я изменил данные так, чтобы хотя бы одно лекарство из вашего набора игрушечных данных соответствовало классу в вашем сокращенном списке классов лекарств.