【问题标题】:time series extraction by event onset按事件发生的时间序列提取
【发布时间】:2020-05-28 20:31:42
【问题描述】:

我正在寻找一个代码来提取每个试验开始的列的时间间隔 (500ms)(称为时间),以便我可以计算每个试验前 500ms 的基线 列的两个连续行之间的实际时间以毫秒为单位有所不同,因为数据集是下采样的,只报告了变化,所以我不能只计算一定数量的行来定义时间间隔。

我试过了:

baseline <- labchart   %>%
dplyr::filter(time[1:(length(labchart$time)+500)])   %>%
dplyr::group_by(Participant, trialonset)

但只收到如下错误消息: 错误:参数 2 过滤条件不计算为逻辑向量 而且我不确定,如果 (time[1:(length(labchart$Time)+500)]) 真的会给我每次试验的前 500 毫秒吗?

【问题讨论】:

    标签: r time filter intervals baseline


    【解决方案1】:

    很难确切地知道您在这里要问什么。我认为你要问的是如何将观察分组为 500 毫秒的周期,只给定观察之间的时间间隔。

    假设数据如下所示:

    ``` r
    labchart <- data.frame(time = sample(50:300, 20, TRUE), data = rnorm(20))
    
    labchart
    #>    time        data
    #> 1   277 -1.33120732
    #> 2   224 -0.85356280
    #> 3    80 -0.32012499
    #> 4   255  0.32433366
    #> 5   227 -0.49600772
    #> 6   248  2.23246918
    #> 7   138 -1.40170795
    #> 8   115 -0.76525043
    #> 9   159  0.14239351
    #> 10  207 -1.53064873
    #> 11  139 -0.82303066
    #> 12  185  1.12473125
    #> 13  239 -0.22491238
    #> 14  117 -0.55809297
    #> 15  147  0.83225435
    #> 16  200  0.75178516
    #> 17  170 -0.78484405
    #> 18  208  1.21000589
    #> 19  196 -0.74576650
    #> 20  184  0.02459359
    

    然后我们可以为总经过时间和观察属于哪个 500 毫秒周期创建一个列,如下所示:

    library(dplyr)
    
    labchart %>% 
      mutate(elapsed = lag(cumsum(time), 1, 0), 
             period = 500 * (elapsed %/% 500))
    
    #>    time        data elapsed period
    #> 1   277 -1.33120732       0      0
    #> 2   224 -0.85356280     277      0
    #> 3    80 -0.32012499     501    500
    #> 4   255  0.32433366     581    500
    #> 5   227 -0.49600772     836    500
    #> 6   248  2.23246918    1063   1000
    #> 7   138 -1.40170795    1311   1000
    #> 8   115 -0.76525043    1449   1000
    #> 9   159  0.14239351    1564   1500
    #> 10  207 -1.53064873    1723   1500
    #> 11  139 -0.82303066    1930   1500
    #> 12  185  1.12473125    2069   2000
    #> 13  239 -0.22491238    2254   2000
    #> 14  117 -0.55809297    2493   2000
    #> 15  147  0.83225435    2610   2500
    #> 16  200  0.75178516    2757   2500
    #> 17  170 -0.78484405    2957   2500
    #> 18  208  1.21000589    3127   3000
    #> 19  196 -0.74576650    3335   3000
    #> 20  184  0.02459359    3531   3500
    

    【讨论】:

    • 数据集看起来像这样:Participant Time GSR Trialonset Messages 15 2741960 35.15788 NA NA 15 2741970 35.15400 NA NA 15 2741980 35.15025 107 #* ClockOnset 15 2741990 35.14600 NA NA 15 2742000 35.14212 NA NA 所以经过的时间并没有真正正确地总结时间列。我想使用 trialonset 变量(所以在这个例子中是 107)作为开始500ms 间隔的点,从时间列中提取以计算 GSR 列的基线。 (抱歉编辑不好,我还没弄清楚如何使用换行符..)
    • 时间列更详细(10ms 为 4 行,之后为 10ms 为 1 行)虽然在集合开始时(因为 GSR 中有更多变化),Participant Time GSR Trialonset Messages 14 0 0.197250 NA NA 14 0 1.187000 NA NA 14 0 1.294625 NA NA 14 0 2.153125 NA NA 14 10 0.890250 NA NA 14 10 5.318625 NA NA
    • @AnnaRender 您能否将数据集的一部分添加到您的问题中?如果您执行dput(Data[1:10,]) 并将结果复制到您问题中的代码块中,则应该可以提供更清晰的图片
    • structure(list(Participant = c("14", "14", "14", "14", "14"), time = c(0, 0, 0, 0, 10), GSR = c(0.19725, 1.187, 1.294625, 2.153125, 0.89025), MessagesNR = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), Messages = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_ )), class = c("grouped_df", "tbl_df", "tbl", "data.frame" ), row.names = c(NA, -5L), groups = structure(list(Participant = "14", .rows = list(1:5)), row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE)) 喜欢这样吗?
    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多