【问题标题】:How to create time bins in R and group data如何在 R 和组数据中创建时间箱
【发布时间】:2021-03-18 02:11:44
【问题描述】:

我的数据如下所示:

trial   event   time_start  time_end    time_duration   region
1         A       36403      36504        101           none
1         B       36506      36516        10            none
1         A       36518      36700        182           top
1         B       36702      36708        6             none
1         A       36710      37054        344           top
1         B       37056      37088        32            none
1         A       37090      37640        550           right
1         B       37642      37678        36            none
1         A       37680      37812        132           left
2         A       41278      41318        40            top
2         B       41320      41336        16            none
2         A       41338      41490        152           top
2         B       41492      41498        6             none
2         A       41500      41994        494           top
2         B       41996      42032        36            none
2         A       42034      42492        458           left

对于每个试验,我想将数据分组到 4 个相等的时间箱中(每次试验的总时间不同)。所以我想我需要:(1)按试验对数据进行分组,(2)为每次试验的累积持续时间添加一列,(3)将每次试验的总时间除以 4,并相应地将每一行分配给时间箱。这就是我想要的:

trial   event   time_start  time_end  time_duration  region cumtime bin
1         A       36403      36504        101         none    101    1
1         B       36506      36516        10          none    111    1
1         A       36518      36700        182         top     293    1
1         B       36702      36708        6           none    299    1
1         A       36710      37054        344         top     643    2
1         B       37056      37088        32          none    675    2
1         A       37090      37640        550         right   1225   4
1         B       37642      37678        36          none    1261   4
1         A       37680      37812        132         left    1393   4
2         A       41278      41318        40          top     40     1
2         B       41320      41336        16          none    56     1
2         A       41338      41490        152         top     208    1
2         B       41492      41498        6           none    214    1
2         A       41500      41994        494         top     708    3
2         B       41996      42032        36          none    744    3
2         A       42034      42492        458         left    1202   4

根据上面的数据,我需要为每个试验中的每个 bin 计算以下内容:(1) 在每个 time bin 中,事件为 A 的行数,(2) 在每个 time bin 中,事件为 A 且区域正确的行数。这就是我想让我的决赛桌看起来像的样子:

trial   bin totalevent_A  totalevent_A_right
1        1       2             0
1        2       1             0
1        3       0             0
1        4       2             1
2        1       2             0
2        2       0             0
2        3       1             0
2        4       1             0

我不知道如何首先按试验对数据进行分组,然后将每个试验的总时间分成 4 个相等的时间箱,并将每个事件分配给它(完整的数据集有 1000 多个试验)。任何建议/替代方法都会非常有帮助!

【问题讨论】:

    标签: r dplyr time-series data.table tidyr


    【解决方案1】:

    这个例程可以用 {dplyr} group_by mutatesummarize 来实现。我把它分成两个结果对象res1res2

    dat <- read.table(text="trial   event   time_start  time_end    time_duration   region
    1         A       36403      36504        101           none
    1         B       36506      36516        10            none
    1         A       36518      36700        182           top
    1         B       36702      36708        6             none
    1         A       36710      37054        344           top
    1         B       37056      37088        32            none
    1         A       37090      37640        550           right
    1         B       37642      37678        36            none
    1         A       37680      37812        132           left
    2         A       41278      41318        40            top
    2         B       41320      41336        16            none
    2         A       41338      41490        152           top
    2         B       41492      41498        6             none
    2         A       41500      41994        494           top
    2         B       41996      42032        36            none
    2         A       42034      42492        458           left", header=TRUE)
    
    library(dplyr, warn.conflicts = FALSE)
    
    res1 <- dat %>% 
      group_by(trial) %>%
      mutate(duration = time_end - time_start,
             total_duration = sum(duration),
             cml_duration = cumsum(duration),
             fractime = cml_duration / total_duration,
             bin = floor(fractime / 0.25 + 0.99)) 
                                             # 0.99 < 1 : fudge factor for group 1:4 not 0:4 or 1:5
    res2 <- res1 %>% 
      group_by(trial, bin) %>%
      summarize(total_event_a = sum(event == "A"), total_event_a_right = sum(event == "A" & region == "right"))
    #> `summarise()` regrouping output by 'trial' (override with `.groups` argument)
    
    res2
    #> # A tibble: 6 x 4
    #> # Groups:   trial [2]
    #>   trial   bin total_event_a total_event_a_right
    #>   <int> <dbl>         <int>               <int>
    #> 1     1     1             2                   0
    #> 2     1     2             1                   0
    #> 3     1     4             2                   1
    #> 4     2     1             2                   0
    #> 5     2     3             1                   0
    #> 6     2     4             1                   0
    

    reprex package (v0.3.0) 于 2020-12-06 创建

    【讨论】:

    • 请注意,当您使用mutate 创建bin 时,使用factor(..., levels=1:4) 可以达到您想要的确切输出,然后res2 group_by(trial, bin) 语句需要.drop = FALSE跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多