此问题是R - identify consecutive sequences
的扩展我有一个数据框,我需要只保留那些在ROI列中我有连续序列 _aCORRECT1 和 _CORRECT1 的试验。 _aCORRECT1 和 _CORRECT1 出现次数并不重要,可以重复这些次数。
在下面的示例中,我可以保留ntrial 78和201,因为 _aCORRECT1 后面跟着 _CORRECT1 。 但是,我需要删除ntrial 10和400.在试验中,10 _aCORRECT1 后面没有 _CORRECT1 。在试用版400 _CORRECT1 之前没有 _aCORRECT1 。
非常感谢!
subject ROI ntrial
sbj05 ff 78
sbj05 as 78
sbj05 fgfsd 78
sbj05 sgf 78
sbj05 jh 78
sbj05 sgsgsfg 78
sbj05 fgsfg 78
sbj05 sgf_aCORRECT1 78
sbj05 dfs_CORRECT1 78
sbj05 ffg 78
sbj05 sdfdsf 78
sbj05 sl 78
sbj05 wgrt 78
sbj05 qswefrd 201
sbj05 ssdg 201
sbj05 sdgfdsg 201
sbj05 sgsgd 201
sbj05 sgsdg 201
sbj05 dd_aCORRECT1 201
sbj05 dd_aCORRECT1 201
sbj05 ffds_CORRECT1 201
sbj05 ffds_CORRECT1 201
sbj05 ffds_CORRECT1 201
sbj05 hy 201
sbj05 gfg 201
sbj05 nbc 201
sbj05 cvbvn 10
sbj05 kpj 10
sbj05 nbvnb 10
sbj05 mnm 10
sbj05 dghsfh_aCORRECT1 10
sbj05 gdh 10
sbj05 fgjj 10
sbj05 gnjdg 10
sbj05 gf 10
sbj05 qw 400
sbj05 vfs 400
sbj05 zx 400
sbj05 zvzv 400
sbj05 zvzv_CORRECT1 400
sbj05 zvzd_CORRECT1 400
sbj05 zvv 400
sbj05 cv 400
sbj05 v 400
sbj05 mngy 400
答案 0 :(得分:1)
使用dplyr
,df1
是一个数据框,告诉您应该保留哪些ntrial值。这是通过为aCORRECT和_CORRECT设置逻辑指示符并检查每个分组的ntrial是否存在相邻值来完成的。 df2
是df
的版本,仅包含有效的ntrials
df1 <- df %>% mutate(aCOR=grepl("aCORRECT",ROI),COR=grepl("_CORRECT",ROI)) %>%
group_by(ntrial) %>% summarise(keep=any(aCOR & lead(COR)))
df2 <- df[df$ntrial %in% df1$ntrial[df1$keep],]
df1
# A tibble: 4 × 2
ntrial keep
<int> <lgl>
1 10 FALSE
2 78 TRUE
3 201 TRUE
4 400 FALSE
df2
subject ROI ntrial
1 sbj05 ff 78
2 sbj05 as 78
3 sbj05 fgfsd 78
4 sbj05 sgf 78
5 sbj05 jh 78
6 sbj05 sgsgsfg 78
7 sbj05 fgsfg 78
8 sbj05 sgf_aCORRECT1 78
9 sbj05 dfs_CORRECT1 78
10 sbj05 ffg 78
11 sbj05 sdfdsf 78
12 sbj05 sl 78
13 sbj05 wgrt 78
14 sbj05 qswefrd 201
15 sbj05 ssdg 201
16 sbj05 sdgfdsg 201
17 sbj05 sgsgd 201
...
答案 1 :(得分:0)
我们可以在ROI
中提取两个目标字符串的相关部分,然后过滤以仅选择ntrial
中连续出现两个目标字符串的值。
library(dplyr)
library(stringr)
df %>% group_by(subject, ntrial) %>%
filter(grepl("_aCORR_CORR", paste(str_extract(ROI, "_a?CORR"), collapse="")))
subject ROI ntrial 1 sbj05 ff 78 2 sbj05 as 78 3 sbj05 fgfsd 78 4 sbj05 sgf 78 5 sbj05 jh 78 6 sbj05 sgsgsfg 78 7 sbj05 fgsfg 78 8 sbj05 sgf_aCORRECT1 78 9 sbj05 dfs_CORRECT1 78 10 sbj05 ffg 78 11 sbj05 sdfdsf 78 12 sbj05 sl 78 13 sbj05 wgrt 78 14 sbj05 qswefrd 201 15 sbj05 ssdg 201 16 sbj05 sdgfdsg 201 17 sbj05 sgsgd 201 18 sbj05 sgsdg 201 19 sbj05 dd_aCORRECT1 201 20 sbj05 dd_aCORRECT1 201 21 sbj05 ffds_CORRECT1 201 22 sbj05 ffds_CORRECT1 201 23 sbj05 ffds_CORRECT1 201 24 sbj05 hy 201 25 sbj05 gfg 201 26 sbj05 nbc 201
这是一个data.table
版本,它也使用基础R gsub
代替str_extract
:
library(data.table)
setDT(df)[, .SD[grepl("_aCORR_CORR", paste(gsub(".*(_a?CORR).*","\\1", ROI),collapse=""))], by=.(subject,ntrial)]