【问题标题】:Multiplication of several vectors几个向量的乘法
【发布时间】:2015-10-28 12:42:17
【问题描述】:

我有 10 个向量(v_1 到 v_10),我需要将它们全部与另一个向量 v_mult(即 v_1*v_mult、v_2*v_mult 等)相乘。如何在 for 循环中解决此问题?我坚持循环解决方案(我没有找到),因为它是更大分析的一部分。

v_10<-c(2, 3, 5, 8)
v_20<-c(3, 9, 0, 1)
v_30<-c(15, 9, 6, 0)
v_40<-c(4, 9, 6, 1)
v_50<-c(1, 7, 3, 9)
v_60<-c(5, 9, 5, 1)
v_70<-c(5, 8, 2, 6)
v_80<-c(5, 8, 1, 6)
v_90<-c(5, 0, 1, 6)
v_10<-c(2, 8, 1, 0)

v_mult<-c(8, 5, 1, 9)

【问题讨论】:

  • 您可以从将 v_1 到 v_10 添加到列表中开始。然后你可以使用循环或 lapply。
  • 这些向量可能不仅应该在一个列表中,而且应该cbinded 到一个矩阵中。然后你可以做m * v_mult
  • 当你发现自己有这样的变量时,退一步想想更合适的数据结构。给变量编号是从不合适的。在这种情况下,矩阵是合适的。在其他情况下,嵌套列表结构可能会。

标签: r loops vector vector-multiplication


【解决方案1】:

这些向量应该一起组成一个矩阵:

vlist <- mget(ls(pattern = "v_[[:digit:]*]"))
m <- do.call(cbind, vlist)
m * v_mult
#     v_10 v_20 v_30 v_40 v_50 v_60 v_70 v_80 v_90
#[1,]   16   24  120   32    8   40   40   40   40
#[2,]   40   45   45   45   35   45   40   40    0
#[3,]    1    0    6    6    3    5    2    1    1
#[4,]    0    9    0    9   81    9   54   54   54

您当然可以使用列子集从矩阵中提取每个向量,例如 m[, "v_10"]m[, 1]

【讨论】:

  • 谢谢。这正是我一直在寻找的解决方案 - 特别是因为它非常简单且易于实施。
【解决方案2】:

我们可以使用mget获取list中的所有向量对象,并使用Maplist的每个元素与'v_mult'相乘。

Map('*',mget(paste('v', seq(10, 100, by=10), sep="_")), list(v_mult))

或使用data.table 中的set,这样会非常快,因为它没有.[data.table 开销。

library(data.table)
DT <- setDT(mget(paste('v', seq(10, 100, by=10), sep="_")))
for(j in seq_along(DT)){
  set(DT, i=NULL, j= j, value= DT[[j]]*v_mult)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2016-07-18
    • 1970-01-01
    相关资源
    最近更新 更多