【问题标题】:Multiply multiple columns in a matrix by another column in same matrix in R将矩阵中的多列乘以R中同一矩阵中的另一列
【发布时间】:2017-01-17 16:59:10
【问题描述】:

我已经看到了有关将一个矩阵乘以另一个矩阵的答案。但我有一个单一的矩阵,完全是数字的。 举个例子:

matrix = read.table(text = 
"ID  Mult    t1  t2  t3  t4  t5
 4   0.164   10  20  30  40  50
 16  0.581   5   10  5   10  5
 42  0.008   16  17  18  19  20
 91  0.328   20  20  20  20  20
 103 0.108   103 42  56  84  61", 
 h = T)

我想将 t1t5 分别乘以乘数,然后将结果放入矩阵的新列中。

我会逐列进行,但事实上我有超过 200 列!

希望有人可以提出更简单的解决方法。

【问题讨论】:

  • 欢迎来到 SO。列出您咨询过的其他来源并解释您的情况有何不同总是一个好主意(否则您的问题可能会被标记为重复)。你看过this post吗?另外,请参阅this post,了解如何提出 R 问题,以便其他人轻松帮助您。它指定使用dput 输出您的数据,以便我们可以轻松地在本地 R 上运行它并查看您看到的内容。另外,别忘了点赞任何有帮助的东西,并将答案标记为正确。

标签: r matrix-multiplication


【解决方案1】:

你可以这样做:

df=read.table(text="ID  Mult    t1  t2  t3  t4  t5
4   0.164   10  20  30  40  50
16  0.581   5   10  5   10  5
42  0.008   16  17  18  19  20
91  0.328   20  20  20  20  20
103 0.108   103 42  56  84  61",h=T)

df[,c(paste0(colnames(df[,grepl("^t.*",colnames(df),perl = T)]),"bis"))]=df[,grepl("^t.*",colnames(df),perl = T)]*df$Mult

df[,grepl("^t.*",colnames(df),perl = T)] 子集df 仅具有以“t”开头的列
df[,c(paste0(colnames(df[,grepl("^t.*",colnames(df),perl = T)]),"bis"))] 采用前一个子集的colnames(),并使用paste0() 与“bis”或任何字符串连接它们来表示变化。这将创建新的列,其中填充了乘法的结果。

> df
   ID  Mult  t1 t2 t3 t4 t5  t1bis t2bis t3bis t4bis t5bis
1   4 0.164  10 20 30 40 50  1.640 3.280 4.920 6.560 8.200
2  16 0.581   5 10  5 10  5  2.905 5.810 2.905 5.810 2.905
3  42 0.008  16 17 18 19 20  0.128 0.136 0.144 0.152 0.160
4  91 0.328  20 20 20 20 20  6.560 6.560 6.560 6.560 6.560
5 103 0.108 103 42 56 84 61 11.124 4.536 6.048 9.072 6.588

【讨论】:

    【解决方案2】:

    有些人不喜欢循环,但我有时喜欢。这是其中之一:)

    mydf<-matrix
    for (i in 3:length(mydf)){
      mydf[,length(mydf)+1] <- mydf$Mult * mydf[i]
    }
    mydf
       ID  Mult  t1 t2 t3 t4 t5   t1.1  t2.1  t3.1  t4.1  t5.1
    1   4 0.164  10 20 30 40 50  1.640 3.280 4.920 6.560 8.200
    2  16 0.581   5 10  5 10  5  2.905 5.810 2.905 5.810 2.905
    3  42 0.008  16 17 18 19 20  0.128 0.136 0.144 0.152 0.160
    4  91 0.328  20 20 20 20 20  6.560 6.560 6.560 6.560 6.560
    5 103 0.108 103 42 56 84 61 11.124 4.536 6.048 9.072 6.588
    

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      相关资源
      最近更新 更多