【问题标题】:Assigning value according to interval in R根据R中的间隔分配值
【发布时间】:2013-10-03 16:02:17
【问题描述】:

如果来自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))

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

这是我尝试过的。它有点工作。 (只是为了表明我的意思....)

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 向量。

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

【问题讨论】:

  • 我认为您正在寻找cut 函数。
  • 我知道函数 'cut' 但在这里不合适......
  • 你肯定在找剪辑。
  • 是的,'cut' 将成为其中的一部分,我现在看到了...

标签: r loops


【解决方案1】:

如果没有发布您想要的输出,很难确定,但这应该可以:

> 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)。我更愿意将其作为一个单独的步骤来避免混乱,但这就是我。

来自 cmets c(0, head(Data$Measure, -1), Inf) 是一个更简单的选择

【讨论】:

  • 并使其一般 w.r.t.矢量长度,只需将Data$Measure[1:9] 替换为head(Data$Measure, -1)
  • 我建议在这种情况下使用findInterval 而不是cut。他们基本上会做同样的事情,但我认为findInterval 更清晰一些。
  • 如果出现 'cut' 我现在遇到错误(....breaks not unique),所以看起来是因为向量包含零。
  • 那是因为构成第二个参数的向量具有重复值。运行c(0, head(Data$Measure, -1), Inf)查看重复值在哪里。
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 2020-06-14
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多