【问题标题】:In a series of series, how to subtract every 1st number in each sub-series event from every nth number in those events?在一系列系列中,如何从这些事件中的每个第 n 个数字中减去每个子系列事件中的每个第一个数字?
【发布时间】:2020-07-28 20:06:56
【问题描述】:

我有多个系列的时间点。一些系列有五个时间点,其他系列有十个或十五个时间点。该系列是五的倍数,因为我测量的事件总是五个时间点长;有些录音连续有多个事件。例如:

系列 1:

  1. 0
  2. 77
  3. 98
  4. 125
  5. 174

系列 2:

  1. 0
  2. 69
  3. 95
  4. 117
  5. 179
  6. 201
  7. 222
  8. 246
  9. 277
  10. 293

0 标志着每个系列的开始。系列 1 是单个事件,但系列 2 是连续两个事件。系列 2 中的第 6 个时间点是该系列中第二个事件的开始。

我有一个 R 数据框,它在一列中包含每个时间点:

dd <- data.frame(
  timepoint=c(0, 77, 98, 125, 174,
     0, 69, 95, 117, 179, 201, 222, 246, 277, 293)
)

我需要知道从每个事件开始到每个事件的第 4 个时间点的持续时间。对于上述数据,这意味着:

  • 持续时间 1:125 - 0 = 125
  • 持续时间 2:179 - 0 = 179
  • 持续时间 3:277 - 201 = 76

我如何编写一段简单的 R 代码来告诉我该间隔的持续时间,而不管有多少系列或事件,即不管列中有多少数字?

我尝试使用 diff() 和 seq_along(),但这似乎只对每第 n 个数字有用,在这种情况下不起作用。

diff(vec[seq_along(vec) %% 4 == 1])

【问题讨论】:

    标签: r


    【解决方案1】:

    这可能是使用 dplyr 的一种方法。我们将数据分解为“运行”,每个 0 处重置,我们有“序列”,每 5 个值重置。

    dd %>% 
      group_by(run =cumsum(timepoint==0)) %>% 
      mutate(seq = (row_number()-1) %/% 5 + 1) %>% 
      group_by(run, seq) %>% 
      summarize(diff=timepoint[4]-timepoint[1])
    #     run   seq  diff
    #   <int> <dbl> <dbl>
    # 1     1     1   125
    # 2     2     1   117
    # 3     2     2    76
    

    这使得将值与它的来源联系起来有点容易。

    如果你只是想使用索引,这里有一个辅助函数

    diff4v1 <- function(x) {
      idx <- (seq_along(x)-1) %% 5+1;
      x[idx==4] - x[idx==1]
    }
    
    diff4v1(dd$timepoint)
    # [1] 125 117  76
    

    【讨论】:

    • 哦,太好了,这个辅助函数确实有帮助!谢谢!
    【解决方案2】:

    这是您的数据框(假设)

    df = data.frame(series = round(rnorm(40, 100, 50)))
    head(df)
      series
    1     16
    2     35
    3     75
    4    125
    5    190
    6     85
    

    这些是你的不同之处

    idx = c(1:nrow(df))
    df[which(idx %% 5 == 4), "series"] - df[which(idx %% 5 == 1), "series"]
    [1]  109  -38 -101  -47   34  -52  -63   -5
    

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 2017-08-23
      • 2021-12-25
      • 1970-01-01
      • 2020-12-27
      相关资源
      最近更新 更多