使用 R 如何识别数据框列中的特定模式并替换为感兴趣的模式?
Using R how to identify specific pattern in columns of dataframe and substitute with pattern(s) of interest?
在数据框文件DT
中,Var1
被unique.TheID
分成Spl_1
和Spl_2
,前三个characters/digits。此外,DT
是 group_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_1
:001
和 044
)。
大多数分组的刺有 Spl_1
001
,这是主要兴趣所在。除了 Spl_1
001
之外的任何东西都是一种人工制品,需要用 001
来识别和替换。
注意 但是,如果分组 Spl_2
没有 Spl_1
和 001
应保持完整。在此示例 (DT
) 中,它是 MLO010
,它只有 Spl_1
:054
和 023
。
意向:
根据分组的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_2
(by
参数)分组的 table。 if
条件检查Spl_1
列中是否存在“001”,如果存在则将“001”和Spl_2
粘贴在一起,否则粘贴Spl_1
和Spl_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
在数据框文件DT
中,Var1
被unique.TheID
分成Spl_1
和Spl_2
,前三个characters/digits。此外,DT
是 group_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_1
:001
和 044
)。
大多数分组的刺有 Spl_1
001
,这是主要兴趣所在。除了 Spl_1
001
之外的任何东西都是一种人工制品,需要用 001
来识别和替换。
注意 但是,如果分组 Spl_2
没有 Spl_1
和 001
应保持完整。在此示例 (DT
) 中,它是 MLO010
,它只有 Spl_1
:054
和 023
。
意向:
根据分组的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_2
(by
参数)分组的 table。 if
条件检查Spl_1
列中是否存在“001”,如果存在则将“001”和Spl_2
粘贴在一起,否则粘贴Spl_1
和Spl_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