如何在 R 中使用矩阵代数创建新列?
How to use matrix algebra in R to create new column?
我有一个包含多列的数据框。我有另一个包含两列的数据框,因子和系数。我想在初始数据帧 (mydata) 中创建一个新列,它是将 mydata(a:e) 的每一行中的每个元素乘以 df 中的系数 (a:e) 的总和。 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
任何建议都会有所帮助!
我们可以在这里使用sweep
,基于df
中的factor
列子集mydata
,然后将其与每个元素的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)
我有一个包含多列的数据框。我有另一个包含两列的数据框,因子和系数。我想在初始数据帧 (mydata) 中创建一个新列,它是将 mydata(a:e) 的每一行中的每个元素乘以 df 中的系数 (a:e) 的总和。 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
任何建议都会有所帮助!
我们可以在这里使用sweep
,基于df
中的factor
列子集mydata
,然后将其与每个元素的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)