Может ли кто-нибудь помочь найти эффективный способ решения математической задачи? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть 5 параметров с некоторыми значениями в именованном векторе.

Вектор 1 = ("param1" = 10, "param2" = 20, param3 = 30, param4 = 20, param5 = 60)

Param1 имеет некоторое значение множителя, равное 3 (param1 * 3). Param2 имеет некоторое значение множителя, равное 2 (Param2 * 2)

. Для param3, param4, param5 мы должны принять среднее значение, если оно есть эти три параметра представлены, и его значения множителей равны одному (среднее значение из трех параметров * 1)

Например, , если значения присутствуют в векторе 1: Примечание: среднее значение из трех параметров равно param3, param4, param5

result = param1 * 3 + param2 *2 + average of three params * 1 / 3 + 2 + 1

Если какой-либо параметр в vector1 отсутствует, код должен выдать вывод для

пример: , если param1 отсутствует в Vector 1

result = param2 * 2 + average of three params * 1 / 2 + 1

выражение должно быть динамическим c на основе параметров, присутствующих в векторе 1

Пример

Input = c ("param1" = 10, "param2" = 20, "param3" = 40, "param4" = 60, "param5 = 20")

Если все параметры присутствуют в t Входное vec выражение должно быть:

expression = 10*3 + 20*2 + (40+60+20/3) * 1 / 3+2+1

Если param2 отсутствует во входном vec, выражение должно быть:

expression = 10*3 + (40+60+20/3) * 1 / 3 + 1

Если param4 отсутствует, выражение должно быть:

expression = 10*3 + 20 * 2 + (40+20/2) * 1 / 3 + 2 + 1

Если param3, param4, param5 отсутствуют

expression = 10 * 3 + 20 * 2 / 3 + 2

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Вы можете воспользоваться несколькими фактами:

1) Когда вы индексируете именованный вектор по имени, которое не существует, он возвращает NA.

2) Математическая операция, включающая NA также вернет NA.

3) Функции sum() и mean() имеют необязательный параметр na.rm, который позволяет автоматически удалять значения NA из расчета.

4) Математическая операция, включающая логическое условие, будет обрабатывать логическое значение (TRUE или FALSE) как числовое 1 или 0.

Таким образом, ваш код может выглядеть следующим образом :

Vector1 <- c(param1=10, param2=20, param3=30, param4=20, param5=60)

expression <- sum(
  Vector1["param1"] * 3,
  Vector1["param2"] * 2,
  mean(c(Vector1["param3"], Vector1["param4"], Vector1["param5"]), na.rm = TRUE),
  na.rm = TRUE
) / sum(
  3 * !is.na(Vector1["param1"]),
  2 * !is.na(Vector1["param2"]),
  1 * !is.nan(mean(c(Vector1["param3"], Vector1["param4"], Vector1["param5"]), na.rm = TRUE))
)
1 голос
/ 03 марта 2020

Может быть, вы можете попробовать код, как показано ниже

wts <- c(3,2,1)
lst <- list("param1","param2",c("param3","param4","param5"))
u <- unlist(Map(function(v) mean(Input[names(Input)%in% v]), lst))
result <- sum(u*wts,na.rm = TRUE)/sum(wts[!is.na(u)])

Пример

> Input
param1 param2 param3 param4 param5 
    10     20     40     60     20 
> result
[1] 18.33333


> Input
param1 param3 param4 param5 
    10     40     60     20 
> result
[1] 17.5


> Input
param1 param2 
    10     20 
> result
[1] 14


> Input
param3 param4 param5 
    40     60     20 
> result
[1] 40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...