【问题标题】:using functions inside a for loop in R在 R 的 for 循环中使用函数
【发布时间】:2015-07-07 19:34:55
【问题描述】:

我已经看到很多类似的情况,但实际上并没有解决我遇到的问题。所以我的问题是如何处理函数(例如均值函数)中的向量值,以及如何将向量值放入标题中。我最近从 SAS 切换到 R,所以我有点困惑。

###### parameters #####
nphase1=50
nphase2=1000
varcount=5
meanshift= 0
sigmashift= 1


##### phase1 dataset/ control limits #####

for (i in 1:varcount)
{
  assign (paste("x",i, sep=""), (rnorm(nphase1,0,1)))
  mean_var[i]=mean(x[i])
  std_var[i]=sd(x[i])
  Upper_SPC_Limit_Method1_var[i]= mean_var[i] + (3 * std_var[i])
  Lower_SPC_Limit_Method1_var[i]= mean_var[i] - (3 * std_var[i])
  moving_range_var[i]= abs(diff(x[i]))
  MR_mean[i]= mean(moving_range_var[i])
  Upper_SPC_Limit_Method2_var[i] =mean_var[i] + (3 * MR_mean[i])
  Lower_SPC_Limit_Method2_var[i] =mean_var[i] - (3 * MR_mean[i])
}

我确信我将不得不做一些类似于 (assign(paste("x",i, sep="") 的事情来标记个人的个人限制,但我无法到达那一步没有能力计算for循环内每个变量的平均值。 我要做的是创建 5 个变量,每个变量有 50 个观察值(正常随机分布)。我想取每个变量的平均值和标准差来使用这些数字构建控制限。

感谢您的洞察力!

【问题讨论】:

  • 你真正想要达到什么目的?从这个问题来看并不是很清楚。此外,R 有一些强大的 for 循环替代方案(如 apply 系列函数),可能会引起人们的兴趣。

标签: r function for-loop


【解决方案1】:

我相信下面的代码可以实现您想要的。我使用了 matrix()、with() 和 apply(),并强烈建议阅读它们以进行此类工作。

Apply() Tutorial

With() Primer

###### parameters #####
nphase1=50
nphase2=1000
varcount=5
meanshift= 0
sigmashift= 1


##### phase1 dataset/ control limits #####

x <- matrix(rnorm(nphase1*varcount, 0, 1), nrow = nphase1, ncol = varcount)
mean_var <- apply(x, 2, mean)
std_var <- apply(x, 2, sd)
df_var <- data.frame(mean_var, std_var)
Upper_SPC_Limit_Method1_var <- with(df_var, mean_var + 3 * std_var)
Lower_SPC_Limit_Method1_var <- with(df_var, mean_var - 3 * std_var)
moving_range_var <- apply(x, 2, function(z) abs(diff(z)))
MR_mean <- apply(moving_range_var, 2, mean)
Upper_SPC_Limit_Method2_var <- with(df_var, mean_var + 3 * MR_mean)
Lower_SPC_Limit_Method2_var <- with(df_var, mean_var - 3 * std_var)

【讨论】:

  • 谢谢!这完成了我想做的事情。我将不得不对如何利用这些功能进行更多研究。我非常习惯在 SAS 中执行宏 Do 循环,所以我的大脑自然而然地认为 for 循环是一个很好的选择。虽然我读到 for 循环是不受欢迎的,但它们往往需要花费大量时间来完成最终结果。
  • 在 R 中避免 for 循环的炒作肯定是有好处的,尽管可能有点夸大其词。在很多情况下 for() 循环是可以接受的,它们绝对是你培养 R 技能的有用工具。由于我的回复回答了您的问题,请单击复选标记接受它作为答案。这样其他人就会知道解决方案有效
【解决方案2】:

您的变量未命名为 x[1]x[2] 等。它们将是 x1x2 等。如果您想要这样做,您可能应该创建一个列表,即x[[i]] &lt;- rnorm(nphase1, 0, 1),但您的代码仍然效率低下。您应该考虑对其进行矢量化,将 x 设为矩阵等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2018-10-31
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多