Создание формулы R с использованием Python - PullRequest
0 голосов
/ 27 февраля 2020

Я пишу программу, которая взаимодействует с R, используя Python. По сути, у меня есть несколько библиотек R, которые я хочу включить в свой код Python. После загрузки rpy2 я определяю свои функции R, которые хочу использовать, в отдельном .R файловом скрипте.

Функция R требует, чтобы мы передали ей формулу для применения некоторой техники oversampling. Ниже приведена функция R, которую я написал:

WFRandUnder <- function(target_variable, other, train, rel, thr.rel, C.perc, repl){
    a <- target_variable
    b <- '~'
    form_begin <- paste(a, b, sep=' ')
    fmla <- as.formula(paste(form_begin, paste(other, collapse= "+")))
    undersampled = RandUnderRegress(fmla, train, rel, thr.rel, C.perc, repl)
    return(undersampled)
}

Я передаю от python имя целевой переменной, а также список, содержащий имена всех других столбцов. Как я хочу, чтобы это было следующим: my_target_variable ~ all other columns

Однако в этих строках:

a <- target_variable
    b <- '~'
    form_begin <- paste(a, b, sep=' ')
    fmla <- as.formula(paste(form_begin, paste(other, collapse= "+"))) 

Формула не всегда формулируется, если в моих данных много столбцов. Что я должен сделать, чтобы это всегда работало? Я объединяю имена всех столбцов с оператором +.

1 Ответ

0 голосов
/ 29 февраля 2020

Благодаря @nicola я смог решить эту проблему, выполнив следующие действия:

create_formula <- function(target_variable, other){
    # y <- target_variable
    # tilda <- '~'
    # form_begin <- paste(y, tilda, sep=' ')
    # fmla <- as.formula(paste(form_begin, paste(other, collapse= "+")))
    # return(fmla)
    y <- target_variable
    fmla = as.formula(paste(y, '~ .'))
    return(fmla)
}

Я вызываю эту функцию из моей программы python, используя rpy2. Это не вызывает проблем, потому что всякий раз, когда мы используем эту формулу, мы будем прикреплять к ней сами данные, поэтому у нее не будет проблем. Пример кода для демонстрации того, что я говорю:

        if self.smogn:
            smogned = runit.WFDIBS(

                 # here is the formula call (get_formula is a python function that calls create_formula defined above in R)
                fmla=get_formula(self.target_variable, self.other),

                # here is the data 
                dat=df_combined,

                method=self.phi_params['method'][0],
                npts=self.phi_params['npts'][0],
                controlpts=self.phi_params['control.pts'],
                thrrel=self.thr_rel,
                Cperc=self.Cperc,
                k=self.k,
                repl=self.repl,
                dist=self.dist,
                p=self.p,
                pert=self.pert)

...