I';在R数据编程中,我一直在执行FOR和IF函数

I';在R数据编程中,我一直在执行FOR和IF函数,r,for-loop,if-statement,R,For Loop,If Statement,所以现在我遇到了一个关于和IF函数的问题 我有一个完整的工作代码,如下所示: #my data input demand.variation=c(1,4,20,23,37) demand.probability=c(0.81,0.85,0.89,0.93,0.97) n.month=25 #generating result matrix result=matrix(0,n.month,2) colnames(result)=c("Month","Demand&q

所以现在我遇到了一个关于和IF函数的问题

我有一个完整的工作代码,如下所示:

#my data input
demand.variation=c(1,4,20,23,37)
demand.probability=c(0.81,0.85,0.89,0.93,0.97)
n.month=25

#generating result matrix
result=matrix(0,n.month,2)
colnames(result)=c("Month","Demand")

#filling result matrix with month index and random demand value
result[,1]=1:n.month
random=runif(n.month,0,1)

#return demand value based on random value
for (i in seq_along(random)) {
  if (random[i]>demand.probability[5]) result[i,2]=demand.variation[5]
  else if (random[i]>demand.probability[4]) result[i,2]=demand.variation[4]
  else if (random[i]>demand.probability[3]) result[i,2]=demand.variation[3]
  else if (random[i]>demand.probability[2]) result[i,2]=demand.variation[2]
  else if (random[i]>demand.probability[1]) result[i,2]=demand.variation[1]
  else result[i,2]=0
}

#final result
result
它正在充分发挥作用,其结果是:

> result
      Month Demand
 [1,]     1      0
 [2,]     2      0
 [3,]     3      0
 [4,]     4      0
 [5,]     5      0
 [6,]     6      0
 [7,]     7      0
 [8,]     8      0
 [9,]     9      4
[10,]    10      0
[11,]    11      0
[12,]    12     23
[13,]    13     37
[14,]    14      0
[15,]    15      1
[16,]    16      0
[17,]    17      0
[18,]    18      0
[19,]    19      1
[20,]    20     20
[21,]    21      0
[22,]    22      0
[23,]    23      0
[24,]    24      0
[25,]    25      0
问题是,我必须重新运行相同的代码,但使用不同的长度和值
demand.variation
demand.probability
,因此,由于手动输入了for和IF,我将面临这两个变量的几十种变化

我的问题是如何生成灵活的FOR和IF语句代码,以涵盖基于随机值返回需求值的任务

脚注:
demand.variation
demand.probability
将始终具有相同的向量长度,并相应地相互连接,这意味着
需求中的第一个值。variation
向量具有
demand.probability
向量中第一个值的概率,依此类推

demand.variation=c(1,4,20,23,37)
demand.probability=c(0.81,0.85,0.89,0.93,0.97)

如果您能在这方面帮助我,我将不胜感激。

您可以添加另一个
for()
循环,从demand.variation向量中的条目数向后计数

for(i in seq_along(random)){
  for(j in seq_along(demand.variation):1){
    if(random[i] > demand.probability[j]){
      result[i,2] <-  demand.variation[j]
    } else {
      result[i,2] <- 0
    }
  }
}
对我来说,这产生了:

> result
      Month Demand
 [1,]     1      0
 [2,]     2     20
 [3,]     3      0
 [4,]     4      0
 [5,]     5      0
 [6,]     6      0
 [7,]     7      1
 [8,]     8      0
 [9,]     9      4
[10,]    10      0
[11,]    11     20
[12,]    12      0
[13,]    13     23
[14,]    14      0
[15,]    15      0
[16,]    16      0
[17,]    17      0
[18,]    18      0
[19,]    19      0
[20,]    20      0
[21,]    21      0
[22,]    22      0
[23,]    23      0
[24,]    24      0
[25,]    25      1

您正试图按区间对连续值(在
随机
中)进行分类,这些区间的限值由
需求.概率
给出,并且应标记为
需求.变量
中给出的值。 这可以通过R中的
cut()
函数来实现。 但是,您必须添加一些附加边框(
-Inf
Inf
,例如值
0

将大的
for
-循环表达式替换为:

result[, 2] <- cut(random, breaks=c(-Inf, demand.probability, Inf), labels=c(0, demand.variation))

result[2]谢谢你的回答。我试图在我的程序中使用你的代码,但它似乎没有按照我想要的方式工作。除此之外,我还收到了25条警告:(在seq_-along(demand.variation)中):1:数值表达式有5个元素:只使用了第一个元素。)我会在对您的代码进行一些研究和修改后回来,因为现在它仍然不能解决我的问题。奇怪的是,我使用了它并收到了一个无错误的输出。我稍后会研究它,看看是否可以为您改进它。所以我检查了您的代码,发现:您的代码只提供了2种输出可能性,demand.variation[j]和0。我的意图是,如果随机[i]不是>需求概率[j],它应该检查随机[i]是否是>需求概率[j-1],并继续检查,直到第一个需求概率向量值。如果最后random[i]小于demand.probability vector中的第一个值,那么可以返回0。你有这个想法吗?请看编辑后的解决方案。我想我现在明白了。谢谢你的回答。我查一下,一会儿就回来。不客气!请注意,
random
值每次都会更改,因为您没有在R中放置用于控制随机数生成器的
种子。因此,对于控制,请运行for循环,并与
cut()
表达式的值进行比较。您好,我回来了。所以我尝试了你的代码,它很快就解决了我的问题。您的代码确实对我的demand.probability数据进行了分类,但它没有返回demand.variation的值,而是返回了一个介于1到6之间的数字,我认为这是类间隔索引。它没有用demand.variation数据标记每个类。这真的很接近,请随时通知我,如果有什么我可以做的自动标记每个类别。目前,我可以手动将索引与我的demand.variation数据链接。谢谢你的帮助!您是否尝试过上一篇文章中的
findInterval
答案。这对于任何长度向量都是可推广的。您好,谢谢您的帮助,我还没有尝试过您的建议,因为前面的答案似乎已经解决了我的问题。我会和其他建议一起尝试,找出哪一个最有效。无论如何谢谢你
> result
      Month Demand
 [1,]     1      0
 [2,]     2     20
 [3,]     3      0
 [4,]     4      0
 [5,]     5      0
 [6,]     6      0
 [7,]     7      1
 [8,]     8      0
 [9,]     9      4
[10,]    10      0
[11,]    11     20
[12,]    12      0
[13,]    13     23
[14,]    14      0
[15,]    15      0
[16,]    16      0
[17,]    17      0
[18,]    18      0
[19,]    19      0
[20,]    20      0
[21,]    21      0
[22,]    22      0
[23,]    23      0
[24,]    24      0
[25,]    25      1
result[, 2] <- cut(random, breaks=c(-Inf, demand.probability, Inf), labels=c(0, demand.variation))
categorize_months <- function(n_months, breaks, labels, seed=42) {
  set.seed(seed)
  random <- runif(n_months, 0, 1)
  months <- 1:n_months
  demands <- cut(random, breaks=c(-Inf, breaks, Inf), labels=c(0, labels))
  df <- data.frame("Month"=months, "Demand"=demands)
  df
}

categorize_months(25, demand.probability, demand.variation, seed=42)