如何识别R中的序列

时间:2017-04-20 17:08:02

标签: r sequence

此问题是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    

2 个答案:

答案 0 :(得分:1)

使用dplyrdf1是一个数据框,告诉您应该保留哪些ntrial值。这是通过为aCORRECT和_CORRECT设置逻辑指示符并检查每个分组的ntrial是否存在相邻值来完成的。 df2df的版本,仅包含有效的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)]