2017-01-26 55 views
2

在數據幀文件DT中,Var1是唯一的。將ID拆分爲Spl_1 & Spl_2由前三位字符/數字組成。另外,DTgroup_bySpl_2。因此,有四組:使用R如何在數據框的列中標識特定模式並替換感興趣的模式?

- 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_1001 & 044)。
大部分分組叮咬有Spl_1001這是主要的興趣。除了Spl_1001之外的任何東西都是一種神器,需要被識別並由001取代。
備註但是,如果組Spl_2沒有任何Spl_1001應保持完整。在這個例子中(DT)它是MLO010,它只有Spl_1054 & 023

意向:
基於分組Spl_2,看Spl_1,看看是否有其中001。如果是這樣,則用001替換non 001Spl_1,並將其與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來做到這一點。但是,我不知道究竟如何?

+0

@Parfait,更正! tnx :) – Daniel

+1

@AndrasDeak tnx,我讀懂了:) – Daniel

回答

2

我們可以通過幾種方式做到這一點,在這裏它與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參數)分組表。 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 
2

考慮具有ave鹼R,假設將總是最低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