简体   繁体   中英

How to use matrix algebra in R to create new column?

I have a dataframe with multiple columns. I have another dataframe with two columns, factor and coefficient. I want to create a new column in the initial dataframe (mydata) that is the sum of multiplying each element in each row of mydata(a:e) by the coefficients (a:e) in df. The result for the first row in the newcol should be 64 (1*1 + 2*2 + 3*3 + 4*4 + 7*5). Ideally, I would be able to somehow replicate this 20+ times with different coefficients.


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

Any advice would be helpful!

We can use sweep here, subset mydata based on factor column in df and multiply it with coefficient for each element and then take rowSums to calculate the sum.

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

Or we can also transpose mydata and multiply the coefficient and get colSums .

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM