如何在R中识别序列

4
这个问题是 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个回答

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

由于某种原因,此代码无法检测出例如*_CORRECT未在_aCORRECT*之前的情况。有什么想法吗? - dede
它适用于您提供的数据。对于ntrial=400,它正确地检测到_CORRECT没有在_aCORRECT之前出现,并得出结论应该排除此值的ntrial(即在df1keep=FALSE)。这不是您要寻找的行为吗?还是您有其他数据它无法处理? - Andrew Gustar
我有更多主题的数据,但它不起作用 - 不确定为什么。我还尝试过 group_by(subject,ntrial) 但也没有帮助。 - dede
你能举个它无法处理的数据的例子吗? - Andrew Gustar

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
这是一个使用基本R gsub 而不是 str_extractdata.table 版本:
library(data.table)

setDT(df)[, .SD[grepl("_aCORR_CORR", paste(gsub(".*(_a?CORR).*","\\1", ROI),collapse=""))], by=.(subject,ntrial)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接