2017-01-26 14 views
2

В файле dataframe DT, Var1 является unique.The ID разделилась на Spl_1 & Spl_2 первыми тремя символов/цифр. Кроме того, DT был group_bySpl_2. Следовательно, существуют четыре группы:Использование R как определить конкретный шаблон в столбцах кадра данных и заменить интересующие вас шаблоны (ы)?

- KLM001 
- OKT004  
- MLO010  
- AAA008 

dataframe файл:

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_1001, который представляет большой интерес. Все, кроме Spl_1001, является своего рода артефактом и нуждается в идентификации и замене на 001.
ПРИМЕЧАНИЕ Однако, если сгруппировано Spl_2доза не имеетSpl_1 с 001 должна быть сохранена. В этом примере (DT) это MLO010, который имеет только Spl_1: 054 & 023.

Намерение:
На основе сгруппированных Spl_2, посмотрите на Spl_1 и посмотреть, если есть 001 среди них. Если это так, замените non 001Spl_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. Однако я не знаю, как именно?

+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_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 
2

Рассмотрим базовую R с ave, предполагая, что всегда будет минимум 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