【问题标题】:R custom running functionR自定义运行函数
【发布时间】:2019-12-16 05:55:42
【问题描述】:

如何在没有循环的情况下获得相同的结果? 它相当于 reactiveX 中的 scan 函数,但具有自定义逻辑 (http://reactivex.io/rxjs/img/scan.png)

for (i in 2:nrow(x)) {
  x$running_number[i] <-
    ifelse(abs(x$running_number[(i - 1)] - x$numbers[i])  > max_diff,
           x$numbers[i],
           x$running_number[(i - 1)])
}

编辑:

在您回复后我不确定我问的是否正确。看看这个数据框

x <- data.frame(
  c(1000, 1010, 1020, 1030, 1100, 1120, 1140, 1150, 1200),
  c(1000, 1000, 1000, 1000, 1100, 1100, 1100, 1100, 1200)
)

colnames(x) <- c('input_v', 'output_v')

给定 x$input_v 需要得到 x$output_v

我可以像这样表达条件:

x$output_v <-
  ifelse(
    abs(x$input_v - somehow_get_me_last_assigned_x_output_v) > 90,
    x$input_v,
    somehow_get_me_last_assigned_x_output_v
  )

【问题讨论】:

    标签: r dplyr lapply rolling-computation


    【解决方案1】:

    我们可以使用diff 来查找相邻元素之间的差异,使用'max-diff' 创建逻辑条件,在ifelse 中使用它来返回'numbers' 或'running_number 的lag '

    with(x, ifelse(c(FALSE, abs(diff(running_number)) > max_diff), 
          numbers, c(NA, running_number[-nrow(x)])))
    

    或者dplyr

    library(dplyr)
    x %>%
      mutate(running_number = case_when(c(FALSE, abs(diff(running_number)) > 
                 max_diff)0 ~ numbers, TRUE ~ lag(running-number))) 
    

    【讨论】:

    • @AndrewVorobyov。我认为max_diff 70 的逻辑在您更新的示例中可能不起作用。你可以试试with(x, ave(input_v, cumsum(c(TRUE, diff(input_v) &gt; 20)), FUN = function(x) x[1])) [1] 1000 1000 1000 1000 1100 1100 1100 1100 1200
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    相关资源
    最近更新 更多