汇总范围内的by_group并将值输出回完整的数据帧

时间:2018-06-20 19:50:32

标签: r dplyr

长时间的监听者,首次调用者。我有一个可能很简单的问题,但我的头撞在墙上试图解决它。我的数据如下:

    SUBJ HEMI  TIME   stimulus spikes
1 E2M022 L     -2.00  REV.BOS     11
2 E2M022 L     -1.99  REV.BOS     11
3 E2M022 L     -1.98  REV.BOS     12
4 E2M022 L     -1.97  REV.BOS      1
5 E2M022 L     -1.96  REV.BOS      6
6 E2M022 L     -1.95  REV.BOS      3

我想要实现的是:

  • 首先,按SUBJ + HEMI +刺激(例如E2M022-R-NCM; E2M022-L-NCM;等)进行分组
  • 然后,将特定时间范围内(例如-2到-0.01)的峰值数量相加,然后将相加后的#除以2(例如,baseline_Hz)

  • 最后,将新值(例如,baseline_Hz)作为新列返回到df,所以看起来可能像这样:

    SUBJ   HEMI  TIME  stimulus   spikes   baseline_Hz
    E2M022 L    -2.00  REV.BOS    11       8
    E2M022 L    -1.99  REV.BOS    9        8
    ...
    E2M022 R    -2.00  REV.BOS    7        6
    E2M022 R    -1.99  REV.BOS    2        6
    ...
    E2M019 L    -2.00  REV.BOS    2        3
    E2M019 L    -1.99  REV.BOS    14       3
    

对于每个subj / hemi / stimulus,它会产生很多重复的值,但是我认为这对我的数据最有意义。我尝试使用以下代码使用{dplyr}进行操作,并且可以成功过滤给定的时间范围,例如:

library(dplyr)

df %>%
  filter(inrange(TIME, -2, -0.01))

但是,如果我尝试总结by_group,就会遇到问题:

df %>%
  filter(inrange(TIME, -2,-0.01)) %>%
  group_by(SUBJ, HEMI, stimulus, add = TRUE) %>%
  summarise(baseline_Hz = sum(spikes))

输出只是所有峰值的总和,而不是按subj / hemi / stimulus:

  baseline_Hz
1       21914

任何帮助都将不胜感激:)

谢谢, 丹

2 个答案:

答案 0 :(得分:0)

inrange函数可能有问题(我之前从未见过?)。根据您的示例汇总了以下内容(更改了一些数据以获取实际的分组)。

library(dplyr)
library(tibble)

df <- tribble(~SUBJ, ~HEMI,  ~TIME,   ~stimulus, ~spikes,
        "E2M022", "L",     -2.00,  "REV.BOS",     11,
        "E2M022", "L",     -1.99,  "REV.BOS",     11,
        "E2M022", "L",     -1.98,  "REV.BOS",     12,
        "E2M021", "L",     -1.97,  "REV.BOS",      1,
        "E2M021", "L",     -1.96,  "REV.BOS2",      6,
        "E2M021", "L",     -1.95,  "REV.BOS2",      3,)


df %>% 
  filter(TIME > -2,
         TIME < -0.01) %>% 
         {inner_join(., 
                     group_by(., SUBJ, HEMI, stimulus) %>%
                       summarise(baseline_Hz = sum(spikes)))}

哪个给

# A tibble: 5 x 6
  SUBJ   HEMI   TIME stimulus spikes baseline_Hz
  <chr>  <chr> <dbl> <chr>     <dbl>       <dbl>
1 E2M022 L     -1.99 REV.BOS      11          23
2 E2M022 L     -1.98 REV.BOS      12          23
3 E2M021 L     -1.97 REV.BOS       1           1
4 E2M021 L     -1.96 REV.BOS2      6           9
5 E2M021 L     -1.95 REV.BOS2      3           9

具有范围

inrange中找到了data.table。在上面进行测试可以得到以下结果,

library(dplyr)
library(tibble)
library(data.table)

df <- tribble(~SUBJ, ~HEMI,  ~TIME,   ~stimulus, ~spikes,
        "E2M022", "L",     -2.00,  "REV.BOS",     11,
        "E2M022", "L",     -1.99,  "REV.BOS",     11,
        "E2M022", "L",     -1.98,  "REV.BOS",     12,
        "E2M021", "L",     -1.97,  "REV.BOS",      1,
        "E2M021", "L",     -1.96,  "REV.BOS2",      6,
        "E2M021", "L",     -1.95,  "REV.BOS2",      3,)


df %>% 
  filter(inrange(TIME, -2, -0.01, incbounds = FALSE)) %>% 
         {inner_join(., 
                     group_by(., SUBJ, HEMI, stimulus) %>%
                       summarise(baseline_Hz = sum(spikes)))}

哪个给予,

# A tibble: 5 x 6
  SUBJ   HEMI   TIME stimulus spikes baseline_Hz
  <chr>  <chr> <dbl> <chr>     <dbl>       <dbl>
1 E2M022 L     -1.99 REV.BOS      11          23
2 E2M022 L     -1.98 REV.BOS      12          23
3 E2M021 L     -1.97 REV.BOS       1           1
4 E2M021 L     -1.96 REV.BOS2      6           9
5 E2M021 L     -1.95 REV.BOS2      3           9

所以看起来一切都按预期工作了。

答案 1 :(得分:0)

要进行故障排除,您应该找到问题的来源。问题实际上出在您的过滤器上,而不是以后。如果您删除过滤器并执行

 df %>%
     group_by(SUBJ, HEMI, stimulus, add = TRUE) %>%
     summarise(baseline_Hz = sum(spikes))

您得到

# A tibble: 3 x 4
# Groups:   SUBJ, HEMI [?]
  SUBJ   HEMI  stimulus baseline_Hz
  <fct>  <fct> <fct>          <dbl>
1 E2M020 L     REV.BOS            9
2 E2M021 L     REV.BOS           13
3 E2M022 L     REV.BOS           22

代替

SUBJ HEMI TIME stimulus spikes
1 E2M022    L   -2  REV.BOS     11

答案是将过滤器更改为filter(TIME <= -.01 & TIME >= -2)%>%

这看起来像:

> df %>%
+     filter(TIME <= -.01 & TIME >= -2)%>%
+     group_by(SUBJ, HEMI, stimulus, add = TRUE) %>%
+     summarise(baseline_Hz = sum(spikes))
# A tibble: 3 x 4
# Groups:   SUBJ, HEMI [?]
  SUBJ   HEMI  stimulus baseline_Hz
  <fct>  <fct> <fct>          <dbl>
1 E2M020 L     REV.BOS            9
2 E2M021 L     REV.BOS           13
3 E2M022 L     REV.BOS           22

希望这会有所帮助(我认为过滤器正在寻找整数,我尝试了inrange()%in%,但他们寻找的是整数)...