Почему функция в R не работает через весь набор входов? Я получаю эту ошибку: замена имеет 1 строку, данные имеют 5 - PullRequest
1 голос
/ 07 апреля 2020

Мне нужно запустить функцию для набора входов. Имеется 4 входа (pd, cl, va, co) для 5 различных ситуаций (5 строк в кадре данных «входы»). Функция должна запускаться для каждой строки по 100 значениям P. И сохранять ответ, который сводит к минимуму разницу с параметром Гивина (в данном случае это отношение).

Ниже приведен воспроизводимый пример.

Проблема, с которой я столкнулся, заключается в том, что она работает хорошо только для первой строки ввода. Поэтому, это дает мне эту ошибку: Error in $<-.data.frame`(`*tmp*`, min.diff, value = list(response = 20.091674500638)) : replacement has 1 row, data has 5".

Обходя это несколько часов, но не смог выяснить ошибку.

Есть подсказка?

Большое спасибо заранее

inputs <- data.frame(pd=c(38, 50, 50, 86, 38),
                     cl=c(15, 40, 30, 81, 15),
                     va=c(150, 145, 160, 141, 150),
                     co=c(3.0, 4.5, 4.0, 4.8, 1.5))

P <- c(seq(0,150,length.out=100))

eq1 <- function(a,b,c,x){
        (a*exp(-((((exp(b)*x))/1000))+c+b))/1000
}

resp.function <- function(pd, cl, va, co, P){
        a <- 10000 + 0.01*pd + (-0.1*cl)
        b <- 2
        c <- -1
        ratio <- co / (va/1000)
        min.diff <- as.data.frame(eq1(a,b,c,P)) %>% 
                        rename(response = "eq1(a, b, c, P)") %>% 
                        mutate(diff=abs(response - ratio)) %>% 
                        slice(which.min(diff)) %>% 
                        select(response)
        return(min.diff)
}

inputs$min.diff <- resp.function(inputs$pd, inputs$cl, inputs$va, inputs$co, P)

1 Ответ

2 голосов
/ 07 апреля 2020

Причина, по которой вы получаете эту ошибку, в том, что ваша функция, как написано, возвращает только 1 значение. Есть 5 столбцов inputs, так что это не работает.

Основной подход R к этому - использовать функцию apply.

inputs$min.diff <- apply(inputs,MARGIN=1,function(x){resp.function(x["pd"], x["cl"], x["va"], x["co"], P)})

Второй аргумент apply указывает, к какому направлению обращаться. 1 указывает на строку, а 2 указывает на столбец.

Как вы, возможно, знаете, ваша функция resp.function фактически не использует аргументы, которые вы передаете, кроме P. Я не верю, что в вашем посте достаточно информации, чтобы я мог определить соответствующую функцию, но если вы проясните свои намерения, я смогу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...