将选定的索引范围与阈值进行比较

问题描述 投票:0回答:1

我想将某个范围内(从i到属于i范围的索引)内的所有分数与最后一个基线分数进行比较,并以递归的方式更新基线分数。该范围基于满足能够确认新基线所需的最小时间差的相应索引。 如果这个范围内的所有分数都低于最后一个基线分数,那么我希望新的基线成为该范围内所有分数的最高值(即最接近旧基线)。

df <- tibble(
i = c("1", "2", "3", "4", "5", "6", "7", "8", "9"),
range_index = c("2", "4", "4", "5", "7", "7", "9", "9", "NA"),
score = c("5", "4", "4", "3", "2", "2", "3", "1", "1")) 

我希望在 sapply 或 for 循环中做类似的事情:

df <- df %>%
mutate(
baseline = first(score),
baseline = sapply(1:n(), function(i) {
  if (all(score[i]:score[range_index[i]]) < baseline[i-1]) {return(max(score[i]:score[range_index[i]]))}
  else {return(baseline[i-1])}}))

但我认为 Score[i]:score[range[i]] 不会将所有分数与最后一个基线进行比较。如果每个分数都低于最后一个基线,我如何创建一个为真的条件?

期望的结果是:

baseline = c("5", "4", "4", "3", "3", "3", "3", "1", "1")

解释:第一个基线是 5。在 i=2 时,新基线设置为 4,因为 i=2 和 i=4(对应范围)之间的所有分数都低于 5。新基线是 4,而不是 3 ,因为 4 是 i=2 中直到 i=4 为止的最大分数。 在 i=4 时,我们获得新的基线 3,因为范围内的所有分数(分数[4]=3,分数[5]=2)都低于最后一个基线,即 4。 在 i=5 时,尽管减少了,但我们并没有获得新的基线,因为范围包括 i=7,并且 Score[7] (==3) 不低于最后一个基线 (==3)。 当所有分数 i[8:9] 都低于最后一个基线 3 时,获得 i=8 处的新基线。

r for-loop dplyr indexing sapply
1个回答
0
投票

我认为这里需要一个

for
循环来迭代。

df <- data.frame(
  range_index = c(2,4,4,5,7,7,9,9,9),
  score = c(5,4,4,3,2,2,3,1,1))
with(
  df,
  {
    baseline <- score
    for (i in 2:nrow(df)) {
      baseline[i] <- min(baseline[i - 1], max(score[i]:score[range_index[i]]))
    }
    baseline
  }
)
#> [1] 5 4 4 3 3 3 3 1 1
© www.soinside.com 2019 - 2024. All rights reserved.