умножить столбцы фрейма данных на его параметры в другом фрейме данных - PullRequest
0 голосов
/ 14 июля 2020

У меня есть параметры для 4 переменных, как показано ниже

parameters <- data.frame(param.x1 = 0.02,
                         param.x2 = 0.03,
                         param.x1.sq = 0.05,
                         param.x2.sq = 0.03)

У меня также есть соответствующие значения 4 переменных, показанных ниже

set.seed(123)
  
dat <- data.frame(
           x1 = rnorm(5), 
           x2 = rnorm(5),
           x1.sq = rnorm(5),
           x2.sq = rnorm(5))

Я хочу умножить каждую переменную на соответствующую параметр, а затем добавьте продукт, как показано ниже

final.val <- (dat$x1 * parameters$param.x1) + 
             (dat$x2 * parameters$param.x2) + 
             (dat$x1.sq * parameters$param.x1.sq) + 
             (dat$x2.sq * parameters$param.x2.sq)

Как мне сделать это, не вводя все уравнение, если у меня более 4 переменных? Порядок моих переменных и параметров всегда будет таким же.

Ответы [ 3 ]

1 голос
/ 14 июля 2020

Вы можете попробовать:

mapply(function(x,y) x*y,dat,parameters)

              x1          x2        x1.sq       x2.sq
[1,] -0.011209513  0.05145195  0.061204090  0.05360739
[2,] -0.004603550  0.01382749  0.017990691  0.01493551
[3,]  0.031174166 -0.03795184  0.020038573 -0.05899851
[4,]  0.001410168 -0.02060559  0.005534136  0.02104068
[5,]  0.002585755 -0.01336986 -0.027792057 -0.01418374
1 голос
/ 14 июля 2020

На практике вы хотите выполнить матричную операцию, поэтому я бы сделал следующее:

c(as.matrix(dat)%*%t(as.matrix(parameters)))
1 голос
/ 14 июля 2020

Мы можем использовать Map/Reduce

final.val2 <- Reduce(`+`, Map(`*`, dat, parameters))

Или используйте %*%

final.val3 <- (as.matrix(dat) %*% unlist(parameters))[,1]

-проверка с выводом OP

identical(final.val, final.val2)
#[1] TRUE

identical(final.val, final.val3)
#[1] TRUE

Или другой вариант с sweep/rowSums

rowSums(sweep(dat, 2,  unlist(parameters), `*`))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...