【问题标题】:How to identify sequences in R如何识别 R 中的序列
【发布时间】:2017-04-21 02:35:41
【问题描述】:

这个问题是R - identify consecutive sequences的延伸

我有一个数据框,我只需要保留那些在 ROI 列中我有 _aCORRECT1_CORRECT1 的连续序列的试验。 _aCORRECT1_CORRECT1 出现多少次无关紧要,它们可以重复。

在下面的示例中,我可以保留 ntrial 78 和 201,因为 _aCORRECT1 后面是 _CORRECT1。 但是,我需要删除 ntrial 10 和 400。在 Trial 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    

【问题讨论】:

    标签: r sequence


    【解决方案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
    ...
    

    【讨论】:

    • 由于某种原因,此代码无法检测到例如 _CORRECT 没有以 _aCORRECT 开头的情况。知道为什么吗?
    • 它适用于您提供的数据。对于ntrial=400,它正确检测到_CORRECT 前面没有_aCORRECT,并得出结论认为应该排除ntrial 的这个值(即df1 中的keep=FALSE)。这不是您要寻找的行为吗?还是您有其他无法处理的数据?
    • 我有更多主题的数据,但它不起作用 - 不知道为什么。我也尝试group_by(subject,ntrial),但没有帮助。
    • 你能举个例子说明一些它不能处理的数据吗?
    【解决方案2】:

    我们可以提取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)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多