使用 R 如何识别数据框列中的特定模式并替换为感兴趣的模式?

Using R how to identify specific pattern in columns of dataframe and substitute with pattern(s) of interest?

在数据框文件DT中,Var1被unique.TheID分成Spl_1Spl_2,前三个characters/digits。此外,DTgroup_by Spl_2。因此有四组:

 - KLM001 
 - OKT004    
 - MLO010      
 - AAA008

数据框文件:

DT
    ID         Spl_1 Spl_2  Var1
1   001KLM001   001 KLM001  xx
2   001KLM001   001 KLM001  rr
3   044KLM001   044 KLM001  qwe
4   023OKT004   023 OKT004  sdf
5   023OKT004   023 OKT004  dfg
6   023OKT004   023 OKT004  ssg
7   023OKT004   023 OKT004  htj
8   023OKT004   023 OKT004  yjy
9   001OKT004   001 OKT004  wttt
10  054MLO010   054 MLO010  dg
11  023MLO011   023 MLO010  asd
12  001AAA008   001 AAA008  dggj
13  001AAA008   001 AAA008  sfe
14  001AAA008   001 AAA008  lkyt
15  056AAA008   056 AAA008  fghe
16  123AAA008   123 AAA008  wert

条件:
虽然 Spl_2 对于分组字符串是相同的,但 Spl_1 是不同的。 (例如 对于 KLM001 有两个 Spl_1001044)。
大多数分组的刺有 Spl_1 001,这是主要兴趣所在。除了 Spl_1 001 之外的任何东西都是一种人工制品,需要用 001 来识别和替换。
注意 但是,如果分组 Spl_2 没有 Spl_1001 应保持完整。在此示例 (DT) 中,它是 MLO010,它只有 Spl_1054023

意向:
根据分组的Spl_2,查看Spl_1,看看其中是否有001。如果是这样,则将 non 001 Spl_1 替换为 001 并将其附加到 Spl_2 并将其放入名为 Cor_ID 的新列中,同时保留整个 DT

预期输出:

    ID         Spl_1 Spl_2  Var1     Cor_ID 
1   001KLM001   001 KLM001  xx      001KLM001
2   001KLM001   001 KLM001  rr      001KLM001
3   044KLM001   044 KLM001  qwe     001KLM001
4   023OKT004   023 OKT004  sdf     001OKT004
5   023OKT004   023 OKT004  dfg     001OKT004
6   023OKT004   023 OKT004  ssg     001OKT004
7   023OKT004   023 OKT004  htj     001OKT004
8   023OKT004   023 OKT004  yjy     001OKT004
9   001OKT004   001 OKT004  wttt    001OKT004   
10  054MLO010   054 MLO010  dg      054MLO010
11  023MLO011   023 MLO010  asd     023MLO010
12  001AAA008   001 AAA008  dggj    001AAA008
13  001AAA008   001 AAA008  sfe     001AAA008
14  001AAA008   001 AAA008  lkyt    001AAA008
15  056AAA008   056 AAA008  fghe    001AAA008
16  123AAA008   123 AAA008  wert    001AAA008

我是 r 的新手。但我想我可以用 gsub 做到这一点。但是,不知具体如何?

我们可以通过几种方式做到这一点,这里是 data.table:

library( data.table )
setDT( DT )

DT[ , Cor_ID := 
        if( "001" %in% Spl_1 ) { 
            paste0( "001", Spl_2 ) 
        } else {
            paste0( Spl_1, Spl_2 )
        }, 
    by = Spl_2 ]

所以我们正在分析按 Spl_2by 参数)分组的 table。 if条件检查Spl_1列中是否存在“001”,如果存在则将“001”和Spl_2粘贴在一起,否则粘贴Spl_1Spl_2一起。

结果:

> DT
#           ID Spl_1  Spl_2 Var1    Cor_ID
#  1: 001KLM001   001 KLM001   xx 001KLM001
#  2: 001KLM001   001 KLM001   rr 001KLM001
#  3: 044KLM001   044 KLM001  qwe 001KLM001
#  4: 023OKT004   023 OKT004  sdf 001OKT004
#  5: 023OKT004   023 OKT004  dfg 001OKT004
#  6: 023OKT004   023 OKT004  ssg 001OKT004
#  7: 023OKT004   023 OKT004  htj 001OKT004
#  8: 023OKT004   023 OKT004  yjy 001OKT004
#  9: 001OKT004   001 OKT004 wttt 001OKT004
# 10: 054MLO010   054 MLO010   dg 054MLO010
# 11: 023MLO011   023 MLO011  asd 023MLO011
# 12: 001AAA008   001 AAA008 dggj 001AAA008
# 13: 001AAA008   001 AAA008  sfe 001AAA008
# 14: 001AAA008   001 AAA008 lkyt 001AAA008
# 15: 056AAA008   056 AAA008 fghe 001AAA008
# 16: 123AAA008   123 AAA008 wert 001AAA008

dplyr类似:

library( dplyr )
DT %<>%
    group_by( Spl_2 ) %>%
    mutate( Cor_ID = 
                if( "001" %in% Spl_1 ) { 
                    paste0( "001", Spl_2 ) 
                } else {
                    paste0( Spl_1, Spl_2 )
                } )

结果:

> DT
# Source: local data frame [16 x 5]
# Groups: Spl_2 [5]
# 
#           ID Spl_1  Spl_2  Var1    Cor_ID
#        <chr> <chr>  <chr> <chr>     <chr>
# 1  001KLM001   001 KLM001    xx 001KLM001
# 2  001KLM001   001 KLM001    rr 001KLM001
# 3  044KLM001   044 KLM001   qwe 001KLM001
# 4  023OKT004   023 OKT004   sdf 001OKT004
# 5  023OKT004   023 OKT004   dfg 001OKT004
# 6  023OKT004   023 OKT004   ssg 001OKT004
# 7  023OKT004   023 OKT004   htj 001OKT004
# 8  023OKT004   023 OKT004   yjy 001OKT004
# 9  001OKT004   001 OKT004  wttt 001OKT004
# 10 054MLO010   054 MLO010    dg 054MLO010
# 11 023MLO011   023 MLO011   asd 023MLO011
# 12 001AAA008   001 AAA008  dggj 001AAA008
# 13 001AAA008   001 AAA008   sfe 001AAA008
# 14 001AAA008   001 AAA008  lkyt 001AAA008
# 15 056AAA008   056 AAA008  fghe 001AAA008
# 16 123AAA008   123 AAA008  wert 001AAA008

考虑具有 ave 的基数 R,假设 001 将始终是最小值 Sp1_1

DT$CorID <- ifelse(ave(DT$Spl_1, DT$Spl_2, FUN=min)!='001', paste0(DT$Spl_1, DT$Spl_2), paste0("001", DT$Spl_2))

#           ID Spl_1  Spl_2 Var1     CorID
# 1  001KLM001   001 KLM001   xx 001KLM001
# 2  001KLM001   001 KLM001   rr 001KLM001
# 3  044KLM001   044 KLM001  qwe 001KLM001
# 4  023OKT004   023 OKT004  sdf 001OKT004
# 5  023OKT004   023 OKT004  dfg 001OKT004
# 6  023OKT004   023 OKT004  ssg 001OKT004
# 7  023OKT004   023 OKT004  htj 001OKT004
# 8  023OKT004   023 OKT004  yjy 001OKT004
# 9  001OKT004   001 OKT004 wttt 001OKT004
# 10 054MLO010   054 MLO010   dg 054MLO010
# 11 023MLO011   023 MLO011  asd 023MLO011
# 12 001AAA008   001 AAA008 dggj 001AAA008
# 13 001AAA008   001 AAA008  sfe 001AAA008
# 14 001AAA008   001 AAA008 lkyt 001AAA008
# 15 056AAA008   056 AAA008 fghe 001AAA008
# 16 123AAA008   123 AAA008 wert 001AAA008