长时间的监听者,首次调用者。我有一个可能很简单的问题,但我的头撞在墙上试图解决它。我的数据如下:
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
我想要实现的是:
然后,将特定时间范围内(例如-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
任何帮助都将不胜感激:)
谢谢, 丹
答案 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%
,但他们寻找的是整数)...