Создание формулы R с использованием Python

Я пишу программу, которая взаимодействует с 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= "+"))) 

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


person Perl    schedule 27.02.2020    source источник
comment
Вместо создания нового объекта formula я бы подмножил data.frame только с other и target_variable, оставив ту же формулу (target_variable~.).   -  person nicola    schedule 27.02.2020


Ответы (1)


Благодаря @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)

person Perl    schedule 29.02.2020