I';在R数据编程中,我一直在执行FOR和IF函数
所以现在我遇到了一个关于和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
#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)