【问题标题】:multiply vector by variable to create a matrix with for loop将向量乘以变量以使用 for 循环创建矩阵
【发布时间】:2021-12-09 10:33:45
【问题描述】:

我正在尝试创建一个矩阵来展示未来 x 年预计的行业产量。

首先我创建了一个 for 循环来创建列名称:(例如 10 年)

column.name <- vector()
for (i in 1:10) {
    object <- paste('ano.',i)
    column.name[i] <- object
}

然后我将我的产品保存在矢量中

products <- c('a','b','c',)

在这种情况下,我有一台可用于所有三种产品的机器。所以,我有一个参与向量,表示考虑到机器容量(4800),每种产品将生产多少。

participation<- c(0.60,0.20,0.20)
amount <- 4800

最后我尝试用 for 循环将“参与”乘以 amout

prod <- matrix(length(products):length(column.name))
for (j in 1:length(column.name)) {
  for (i in 1:length(product)) {
    dado <- participation[i]*amount
    prod[i,j] <- dado
  }
  return(prod)
}

理论上,我会得到一个矩阵,其中包含每年按产品划分的产值,用于计算收入。然而,我得到的只是一个空值的 1x1 矩阵。

你能帮帮我吗?

【问题讨论】:

  • 你能显示你的预期输出吗?
  • ano.1 ano.2 ano.3 ano.4 ano.5 ano.6 ano.7 ano.8 ano.9 ano.10 [1,] a 2880 2880 2880 2880 2880 2880 2880 2880 2880 2880 [2,] b 960 960 960 960 960 960 960 960 960 960 [3,] c 960 960 960 960 960 960 960 960 960 960

标签: r loops for-loop


【解决方案1】:

您很接近,这是您示例的工作版本:

column.name <- vector()
for (i in 1:10) {
  object <- paste('ano.',i)
  column.name[i] <- object
}

products <- c('a','b','c')

participation<- c(0.60,0.20,0.20)
amount <- 4800

prod <- matrix(data = NA, nrow = length(products), ncol = length(column.name))

for (j in 1:length(column.name)) {
  for (i in 1:length(products)) {
    dado <- participation[i]*amount
    prod[i,j] <- dado
  }
}

需要考虑的几点:

  • matrix() 创建一个带有参数的新矩阵:data、nrow、ncol(按此顺序)。您应该按顺序指定每个参数或明确命名参数(即nrow=),否则您的第一个参数将被解释为data 参数。
  • 小心错别字!你有length(product) 而不是length(products)products 中有一个额外的逗号,等等。
  • 在您的具体问题范围之外,还有一个更深层次的问题是您是否应该使用矩阵和 data.frame 进行分析。

【讨论】:

  • 感谢您的回答。但现在我得到了一个 3x10 矩阵,但只有第一列有值。其他都是 NA。
  • 您是否正在清除您的环境(任何旧的 R 对象)并单独运行此示例代码?你应该得到一个 3x10 矩阵,看起来像这样 &gt; prod [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 2880 2880 2880 2880 2880 2880 2880 2880 2880 2880 [2,] 960 960 960 960 960 960 960 960 960 960 [3,] 960 960 960 960 960 960 960 960 960 960
  • 如果您想要的输出是别的,请告诉我。
  • 是的,这是所需的输出,我正在运行我的所有代码。我把'rm(list = ls(all = T))'放在我的代码之前清理所有内容。
【解决方案2】:

你在寻找这样的东西吗?

column.name <- paste0('ano.', 1:10)
products <- c('a','b','c')
participation<- c(0.60,0.20,0.20)
amount <- 4800

mat <- matrix(NA, 
              nrow = 3, 
              ncol = 10,
              dimnames = list(product = products,
                              ano = column.name))


mat[] <- participation * amount

mat
#>        ano
#> product ano.1 ano.2 ano.3 ano.4 ano.5 ano.6 ano.7 ano.8 ano.9 ano.10
#>       a  2880  2880  2880  2880  2880  2880  2880  2880  2880   2880
#>       b   960   960   960   960   960   960   960   960   960    960
#>       c   960   960   960   960   960   960   960   960   960    960

reprex package (v2.0.0) 于 2021 年 10 月 22 日创建

另一种选择是使用outer函数,并在矩阵产生后命名矩阵的行和列

participation<- c(0.60,0.20,0.20)
amount <- rep(4800, 10)

mat <- outer(participation, amount)

colnames(mat) <- paste0('ano.', 1:10)
row.names(mat) <- c('a','b','c')

mat
#>   ano.1 ano.2 ano.3 ano.4 ano.5 ano.6 ano.7 ano.8 ano.9 ano.10
#> a  2880  2880  2880  2880  2880  2880  2880  2880  2880   2880
#> b   960   960   960   960   960   960   960   960   960    960
#> c   960   960   960   960   960   960   960   960   960    960

reprex package (v2.0.0) 于 2021 年 10 月 22 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多