Как использовать матричную алгебру в R для создания нового столбца? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть датафрейм с несколькими столбцами. У меня есть другой фрейм данных с двумя столбцами, фактор и коэффициент. Я хочу создать новый столбец в исходном кадре данных (mydata), который является суммой умножения каждого элемента в каждой строке mydata (a: e) на коэффициенты (a: e) в df. Результат для первой строки в newcol должен быть 64 (1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 + 7 * 5). В идеале я мог бы как-то повторить это 20+ раз с разными коэффициентами.


mydata <- data.frame(a = 1:10, b = 2:11, c = 3:12, d = 4:13, d_1 = 5:14, d_2 = 6:15, d_3 = 7:16, e = 8:17)
df <- data.frame(factor = c('a','b','c','d','e'), coefficient = 1:5)

mydata$newcol <- mydata[,c("a","b","c","d","e")] %*% df$coefficient
mydata$newcol2 <- mydata[,c("a","b","c","d_1","e")] %*% df$coefficient

Любой совет будет полезен!

1 Ответ

0 голосов
/ 06 ноября 2019

Мы можем использовать sweep здесь, подмножество mydata на основе столбца factor в df и умножить его на coefficient для каждого элемента, а затем взять rowSums для вычисления суммы.

mydata$newcol <- rowSums(sweep(mydata[as.character(df$factor)], 2,df$coefficient, `*`))

mydata
#    a  b  c  d d_1 d_2 d_3  e newcol
#1   1  2  3  4   5   6   7  8     70
#2   2  3  4  5   6   7   8  9     85
#3   3  4  5  6   7   8   9 10    100
#4   4  5  6  7   8   9  10 11    115
#5   5  6  7  8   9  10  11 12    130
#6   6  7  8  9  10  11  12 13    145
#7   7  8  9 10  11  12  13 14    160
#8   8  9 10 11  12  13  14 15    175
#9   9 10 11 12  13  14  15 16    190
#10 10 11 12 13  14  15  16 17    205

Или мы также можем транспонировать mydata и умножить coefficient и получить colSums.

colSums(t(mydata[as.character(df$factor)]) *  df$coefficient)
...