Как автоматически умножить и добавить некоторый коэффициент к кадру данных в R? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть этот набор данных

obs <- data.frame(replicate(8,rnorm(10, 0, 1)))  

и эти коэффициенты

coeff <- data.frame(replicate(8,rnorm(2, 0, 1)))

Для каждого столбца obs мне нужно умножить первый элемент первого столбца и добавить второйэлемент первого столбца тоже.Мне нужно сделать то же самое для 8 столбцов.Я где-то читал, что если кто-то копирует и вставляет код несколько раз, вы делаете что-то не так ... и это именно то, что я сделал.

obs.transformed.X1 <-(obs[1]*coeff[1,1])+coeff[2,1]
obs.transformed.X2 <-(obs[2]*coeff[1,2])+coeff[2,2]
       .
       .
       .
       .
       . 
obs.transformed.X8  <-(obs[8]*coeff[1,8])+coeff[2,8]

Я знаю, что есть более разумный способ сделать это (цикл?), но я просто не мог понять это.Любая помощь будет оценена.

Это то, что я пробовал, но я получаю только последний столбец

for (i in 1:length(obs)) {
    results=(obs[i]*coeff[1,i])+coeff[2,i]
    }

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Я придумал это решение ..

results = list()
for (i in 1:length(obs)) {
        results[[i]]=(obs[i]*coeff[1,i])+coeff[2,i]
}

results <- as.data.frame(results)

Есть ли эффективный способ сделать это?

0 голосов
/ 21 февраля 2019

Я использовал Map

results <- as.data.frame(Map(`+`, Map(`*`, obs, coeff[1,]), coeff[2,]))

Это также должно дать то, что вы ищете.

0 голосов
/ 21 февраля 2019

Если вы приведете к классу матрицы, вы можете использовать функцию развертки последовательно, сначала умножая столбцы на первую строку коэффициента, а затем, добавляя вторую строку, снова по столбцам:

obs <- data.frame(matrix(1:60, 10))  # I find checking with random numbers difficult
coeff <- data.frame(matrix(1:12,2))
sweep( 
   sweep(as.matrix(obs), 2, as.matrix(coeff)[1,], "*"), # first operation is "*"
           2, as.matrix(coeff)[2,], "+" )   # arguments for the addition
 #--------------------------------
      X1 X2  X3  X4  X5  X6
 [1,]  3 37 111 225 379 573
 [2,]  4 40 116 232 388 584
 [3,]  5 43 121 239 397 595
 [4,]  6 46 126 246 406 606
 [5,]  7 49 131 253 415 617
 [6,]  8 52 136 260 424 628
 [7,]  9 55 141 267 433 639
 [8,] 10 58 146 274 442 650
 [9,] 11 61 151 281 451 661
[10,] 12 64 156 288 460 672

Уменьшено количество столбцов, поскольку ваш исходный код был слишком широким для моей консоли Rstudio.Но это должно быть очень общим.Я подозреваю, что есть метод эквивалентного матричного оператора, но он не пришел ко мне

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