【问题标题】:R: dynamic column name in for loop with cbind at each stepR:for循环中的动态列名,每一步都使用cbind
【发布时间】:2015-12-09 19:10:11
【问题描述】:

我的代码是:

N = 4;

pred_sales_mean <- c(Q1 = 11000, Q2 = 15000, Q3 = 16000, Q4 = 11000)
pred_sales_sd <- c(Q1 = 3000, Q2 = 4000, Q3 = 5000, Q4 = 3000)

pred_sales <- rbind(mean = pred_sales_mean, sd = pred_sales_sd)

sales <- vector()
for (q in paste("Q", 1:4, sep = "")){
            sales <- cbind(sales, q = round(rnorm(N, pred_sales['mean',q], pred_sales['sd',q])));
    # other code indexing sales[,q]
}

在哪里

> pred_sales
        Q1    Q2    Q3    Q4
mean 11000 15000 16000 11000
sd    3000  4000  5000  3000

我想在第一个循环中得到这个:

> sales
      Q1
 [1,]  8
 [2,]  1
 [3,] -7
 [4,] -4

与此相反:

> sales
      q
[1,]  8
[2,]  1
[3,] -7
[4,] -4

分别用于第二个循环:

> sales
      Q1 Q2
 [1,]  8 -3
 [2,]  1  4
 [3,] -7  0
 [4,] -4 -1

与此相反:

> sales
      q  q
[1,]  8 -3
[2,]  1  4
[3,] -7  0
[4,] -4 -1

我找到了this simular question,但那里没有给出我正在寻找的解决方案:

【问题讨论】:

  • 循环结束后只做names(sales) &lt;- paste0("Q", 1:4)?尽管在 for 循环中增长对象的整个概念至少在 R 中是根本不正确的。最好你能解释一下你真正想要达到的目标,我们会努力指导更好的方向。例如,您的循环可以仅转换为 sales &lt;- matrix(round(rnorm(16, 1, 5)), 4) ; colnames(sales) &lt;- paste0("Q", 1:4)
  • 我编辑了这篇文章,并澄清了我的目标。
  • 所以你不能只做matrix(rnorm(16, unlist(pred_sales[1, ]), unlist(pred_sales[2, ])), 4)吗? (如果pred_salesdata.frame。如果它是matrix,则不需要unlist
  • 这似乎有效。谢谢。
  • 但是您需要转置结果,因为 Q1 是第一行,而不是第一列,因为矩阵是由列循环填充均值和 sd 的 4 个值,除非您添加 byrow=TRUE。

标签: r cbind


【解决方案1】:

你确定要使用 for 循环吗?

> result <- sapply(1:N, function(x) round(rnorm(4, 
+      pred_sales["mean", x], pred_sales["sd", x])))
> colnames(result) <- paste0("Q", 1:4)
> result
        Q1    Q2    Q3   Q4
[1,] 13209 17186 16570 8510
[2,] 15586  9408 16366 7209
[3,] 10443 19492 10887 9231
[4,] 13215 11634 20564 8990

【讨论】:

  • 你也确定要使用循环吗?
  • 一个循环,但不是一个 for 循环。
  • 你根本不需要任何循环,看我的评论。
猜你喜欢
  • 2012-04-14
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
相关资源
最近更新 更多