我希望将某个范围(从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,因为该范围(Score[4]=3,Score[5]=2)中的所有分数都低于上一条基线,即4. 在i=5时,尽管减少了,但我们没有获得新的基线,因为范围包括i=7,并且分数[7](==3)不低于上一个基线(==3). 由于所有分数i[8:9]都低于上一次基线3,因此获得了i=8的新基线.