根据R中的间隔分配值

时间:2013-10-03 16:02:17

标签: r loops

如果Random.length的值基于data.frame Data$Measure落入给定的时间间隔,我想分配值(概率)。

示例数据:

set.seed(123)
Data <- data.frame(Measure=sort(rnorm(10,5,2),decreasing=FALSE),
        Probability=sort(runif(10,0,1),decreasing=FALSE))
Random.length <- as.vector(sort(rnorm(5,5,2),decreasing=FALSE))

在这里,我希望能够将概率分配给data.frame Random.length中与值Measure对应的Data向量。

这是我尝试过的。它有点工作。 (唯一能表明我的意思......)

AssignValue <- function (x,y,z){
CopyNumber <- rep(0, length(x))
for(i in 1:length(x)){
    if(x[i] <= y[1]) { CopyNumber[i] <- z[1]
} else if(x[i] > y[1] & x[i] < y[2]) {  CopyNumber[i] <- z[2]
} else if(x[i] > y[2] & x[i] < y[3]) {  CopyNumber[i] <- z[3]
} else if(x[i] > y[3] & x[i] < y[4]) {  CopyNumber[i] <- z[4]
} else if(x[i] > y[4] & x[i] < y[5]) {  CopyNumber[i] <- z[5]
} else if(x[i] > y[5] & x[i] < y[6]) {  CopyNumber[i] <- z[6]
} else if(x[i] > y[6] & x[i] < y[7]) {  CopyNumber[i] <- z[7]
} else if(x[i] > y[7] & x[i] < y[8]) {  CopyNumber[i] <- z[8]
} else if(x[i] > y[8] & x[i] < y[9]) {  CopyNumber[i] <- z[9]
} else if(x[i] > y[9]) {  CopyNumber[i] <- z[10]
}
}
CopyNumber
}


AssignValue(Random.length,Data$Measure,Data$Prob)

现在我的data.frame Data的长度为51,因此我所拥有的实际循环最多... z [51]基本上扫描整个data.frame。我只是缩短了这个以进行演示。所以实际的解决方案应该能够处理可能的任意长度。

此外,解决方案应该能够使用任意长度的Random.length向量。

编辑:循环结束时出现小错误,现已更正。

1 个答案:

答案 0 :(得分:4)

如果没有发布所需的输出,很难确定,但这应该有效:

> Data$Prob[cut(Random.length, c(0, Data$Measure[1:9], Inf))]

[1] 0.1471136 0.5941420 0.8895393 0.8895393 0.9942698

要以编程方式调整Data$Measure的索引,您需要ind = 1:(nrow(Data)-1)。我宁愿这样做是为了避免混乱,但这只是我。

来自评论的

c(0, head(Data$Measure, -1), Inf)是一个更简单的替代方案