【问题标题】:Conditional time difference between rows. R & dplyr/data.table行之间的条件时间差。 R&dplyr/data.table
【发布时间】:2017-04-28 19:39:18
【问题描述】:

所以我有一个包含两列的数据框:

set.seed(123)
nrows   <- 100
my_data <- data.frame(side = sample(c(-1, 1), nrows, replace = TRUE),
                        value = 1:nrows)

一个称为值(测量时间)和一个称为边,其中包含两个值(-1 和 1)。

对于每一行,我需要知道自上次出现边不等于当前边的行以来经过了多少时间(增量值)。在慢 R 代码中:

slow_function <- function(my_data){
    stopifnot(!is.null(my_data$side))
    stopifnot(!is.null(my_data$value))

    value_past <- rep(NA, nrow(my_data))
    for(i in 2:nrow(my_data)){
            current_value <- -1 * my_data$side[i]
            last_mirror   <- rev(which(my_data$side[1:(i-1)] == current_value))[1]
            value_past[i] <- my_data$value[i] - my_data$value[last_mirror]
    }                       
    return(value_past)
}

my_data$res <- slow_function(my_data)

head(my_data)
#   side value res
# 1   -1     1  NA
# 2    1     2   1
# 3   -1     3   1
# 4    1     4   1
# 5    1     5   2
# 6   -1     6   1

我正在尝试使用 dplyr 或 data.table 魔术快速完成此操作。

【问题讨论】:

    标签: r data.table dplyr


    【解决方案1】:

    非 equi 更新连接有效:

    library(data.table)
    setDT(my_data)
    my_data[, other_side := -1*side ]
    
    my_data[, v :=
      .SD[.SD, on=.(side = other_side, value < value), mult="last", i.value - x.value ]
    ]
    
    # test
    my_data[ res != v, .N ] # 0
    

    这可能也可以通过滚动连接来实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-24
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多