2017-08-24 48 views
1

我在data.frame中有一个向量ACCNS E. ACCNS具有离散值0,1,5,12,26或40。喜欢制作另一个具有基于0-1,1-5,5-12,12-26,26-40和40-100的“runif”值的矢量ACCNSrandom。我已经尝试过嵌套的ifelse,但每次都得到相同的值(如报告here)。我无法解决如何将这篇文章中给出的答案应用到更一般的形式。任何帮助将非常感激。R:如果另一个向量中的值在x和y之间,则范围之间的随机数

E<-data.frame(ACCNS=sample(c(0,1,2.5,5,12,26,40),50,replace = T)) 

E$ACCNSrandom <- ifelse(E$ACCNS == 0, runif(1,0,1), 
         ifelse(E$ACCNS>0 & E$ACCNS <= 2.5, runif(1,1,2.5), 
         ifelse(E$ACCNS > 2.5 & E$ACCNS<12, runif(1,2.5,12), 
           ifelse(E$ACCNS >= 12 & E$ACCNS<40, runif(1,12,40), 
             ifelse(E$ACCNS >= 40 & E$ACCNS<100, runif(1,40,100),0 
               ) ) ))) 
+0

我对任何解决方案都是开放的,只要它是一个小数而不是因素,因为我需要将它与以后的另一个数相乘。 – HCAI

+0

您应该在问题中包含此评论,它是其中的一部分。 –

回答

2

一个简单的量化的解决方案:

lower <- c(0, 1, 2.5, 5, 12, 26, 40) 
upper <- c(lower[-1], 100) 
E <- data.frame(ACCNS = sample(lower, 50, replace = TRUE)) 

ind <- match(E$ACCNS, lower) 
E$ACCNSrandom <- runif(length(ind), lower[ind], upper[ind]) 
+0

@akrun我不明白你的评论。你能解释更多吗? –

+0

不要这样想。 “ACCNS具有离散值0,1,5,12,26或40.”他说。 –

+0

您希望在之前定义'ACCNS'并在之后使用'lower < - sort(unique(E $ ACCNS))'? –

2

这里是做你想要的东西的一种方式。

set.seed(1234) # make it reproducible 

i1 <- E$ACCNS == 0 
i2 <- 0 < E$ACCNS & E$ACCNS <= 2.5 
i3 <- 2.5 < E$ACCNS & E$ACCNS < 12 
i4 <- 12 <= E$ACCNS & E$ACCNS < 40 
i5 <- 40 <= E$ACCNS & E$ACCNS < 100 

E$ACCNSrandom <- numeric(nrow(E)) 
E$ACCNSrandom[i1] <- runif(sum(i1), 0, 1) 
E$ACCNSrandom[i2] <- runif(sum(i2), 1, 2.5) 
E$ACCNSrandom[i3] <- runif(sum(i3), 2.5, 12) 
E$ACCNSrandom[i4] <- runif(sum(i4), 12, 40) 
E$ACCNSrandom[i5] <- runif(sum(i5), 40, 100) 

E$ACCNSrandom 
+0

非常感谢您的回答。我想接受F.Privés,因为它似乎更快。 – HCAI

+1

@HCAI很高兴为您服务。至于你接受的那个,这显然是你的选择。 –

相关问题