извлекать только буквы после _ с числами между - PullRequest
0 голосов
/ 24 мая 2018

Итак, у меня есть два столбца, которые выглядят так:

    V1                                V2
    ENSP00000222573_N559D             ENSG00000105855
    ENSP00000222573_N559D             ENSG00000105855
    ENSP00000267853_E337*             ENSG00000108239
    ENSP00000299441_R1672P,R1672G     ENSG00000127415
    ENSP00000334642_K277N.            ENSG00000134324
    ENSP00000342952_N585R             ENSG00000134324

Во-первых, мне нужен первый столбец для извлечения всех букв / знаков после _, поэтому результаты должны выглядеть следующим образом:

V1      V2
ND      ENSG00000105855
ND      ENSG00000105855
E*      ENSG00000108239
RP,RG   ENSG00000127415
KN      ENSG00000134324
NR      ENSG00000134324

Тогда я бы хотел отфильтровать так, чтобы только тогда, когда оба V1 и V2 вместе удваиваются, они отфильтровываются.Таким образом, окончательный результат будет:

  V1      V2
    ND      ENSG00000105855
    E*      ENSG00000108239
    RP,RG   ENSG00000127415
    KN      ENSG00000134324
    NR      ENSG00000134324

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

В качестве опции можно использовать sapply и strsplit как:

sapply(df, function(x){
 sapply(strsplit(x, split = "_"), function(y){
   if(length(y)<2){
     y
   } else {
     gsub("[0-9]+","",y[2])
   }
 })
  }) %>% as.data.frame() %>% distinct()


#      V1              V2
# 1    ND ENSG00000105855
# 2    E* ENSG00000108239
# 3 RP,RG ENSG00000127415
# 4   KN. ENSG00000134324
# 5    NR ENSG00000134324

Данные:

df <- read.table(text = 
 "V1                                V2
ENSP00000222573_N559D             ENSG00000105855
ENSP00000222573_N559D             ENSG00000105855
ENSP00000267853_E337*             ENSG00000108239
ENSP00000299441_R1672P,R1672G     ENSG00000127415
ENSP00000334642_K277N.            ENSG00000134324
ENSP00000342952_N585R             ENSG00000134324",
stringsAsFactors = FALSE, header = TRUE)
0 голосов
/ 24 мая 2018

Решение с использованием .dat2 - конечный результат.

library(tidyverse)

dat2 <- dat %>%
  separate(V1, into = c("Re", "V1"), sep = "_") %>%
  select(-Re) %>%
  mutate(V1 = str_replace_all(V1, "[0-9]*", "")) %>%
  distinct(V1, V2, .keep_all = TRUE)
dat2
#      V1              V2
# 1    ND ENSG00000105855
# 2    E* ENSG00000108239
# 3 RP,RG ENSG00000127415
# 4   KN. ENSG00000134324
# 5    NR ENSG00000134324

ДАННЫЕ

dat <- read.table(text = "V1                                V2
    ENSP00000222573_N559D             ENSG00000105855
                  ENSP00000222573_N559D             ENSG00000105855
                  'ENSP00000267853_E337*'             ENSG00000108239
                  'ENSP00000299441_R1672P,R1672G'     ENSG00000127415
                  'ENSP00000334642_K277N.'            ENSG00000134324
                  ENSP00000342952_N585R             ENSG00000134324",
                  header = TRUE, stringsAsFactors = FALSE)
...