Фильтрация по числовым значениям в r, где набор данных основан на тексте - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь отфильтровать эти значения, когда они больше 5 , но в моем столбце данных есть значения, выраженные в текстовой форме, например:

View(vardata)

C1    Variation
DNA   GT=00.15,TT=08.11,TA=00.05,GA=00.00
RNA   GAU=00.00,GGU=00.90
DNA   TGGTTA=00.45,TTGATAA=21.8
DNA   ATGG=11.5
RNA   GUG=00.05,UGG=00.00
DNA   ATA=00.15,ATG=00.95

Я искренне не понимаю, как заставить R интерпретировать значения, включенные в эту форму, как числовые, чтобы отфильтровать их.

Поскольку мне не нужно указывать, какой кодбуква имеет значение больше, чем число X, теоретически я пытался просто отфильтровать эти значения через

selectedvalues = subset(vardata, c(Variation) > 5)

, где бы я брал только те значения, в которых столбец Variation имеетчисловое значение больше 5 , где я мог бы получить что-то вроде:

View(selectedvalues)

C1    Variation
DNA   GT=00.15,TT=08.11,TA=00.05,GA=00.00
DNA   TGGTTA=00.45,TTGATAA=21.8
DNA   ATGG=11.5

Как только в этих случаях появляется значение больше 5 .

Но, как я уже сказал, я не могу найти способ, где R интерпретировал бы заданные значения, чтобы отсканировать их как числа, а не как текст или символы.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019
library(dplyr)
library(stringr)
#\\d* 0 or more digits, \\.? 0 or 1 dot, \\d+ 1 or more digits
df %>% mutate(digits=str_match_all(Variation,'\\d*\\.?\\d+'),
              flag=sapply(digits,function(x)sum(as.numeric(x)>5))) %>% 
              filter(flag>0)

     C1                           Variation                     digits flag
  1 DNA GT=00.15,TT=08.11,TA=00.05,GA=00.00 00.15, 08.11, 00.05, 00.00    1
  2 DNA           TGGTTA=00.45,TTGATAA=21.8                00.45, 21.8    1
  3 DNA                           ATGG=11.5                       11.5    1

Данные

df <- read.table(text = "
C1    Variation
DNA   'GT=00.15,TT=08.11,TA=00.05,GA=00.00'
                 RNA   'GAU=00.00,GGU=00.90'
                 DNA   'TGGTTA=00.45,TTGATAA=21.8'
                 DNA   'ATGG=11.5'
                 RNA   'GUG=00.05,UGG=00.00'
                 DNA   'ATA=00.15,ATG=00.95'
                 ", header=TRUE)
0 голосов
/ 10 февраля 2019

Здесь вы можете выбрать str_extract из stringr

library(stringr)
df1[sapply(str_extract_all(df1$Variation, "[0-9]+\\.[0-9]+"), 
         function(x) any(as.numeric(x) > 5)), ]
#   C1                           Variation
#1 DNA GT=00.15,TT=08.11,TA=00.05,GA=00.00
#3 DNA           TGGTTA=00.45,TTGATAA=21.8
#4 DNA                           ATGG=11.5
0 голосов
/ 10 февраля 2019

Вот базовый подход R с использованием apply вместе с strsplit:

keep <- sapply(vardata$Variation, function(x) {
    sum(sapply(strsplit(x, ",\\s*")[[1]], function(y) {
        as.numeric(strsplit(y, "=")[[1]][2]) > 5
    })) > 0
})
vardata[keep, ]

C1                           Variation
1 DNA GT=00.15,TT=08.11,TA=00.05,GA=00.00
3 DNA           TGGTTA=00.45,TTGATAA=21.8
4 DNA                           ATGG=11.5

Идея этого подхода состоит в том, чтобы сначала разделить запятыми:

[TGGTTA=00.45, TTGATAA=21.8]

Затеммы разбиваем каждое из двух вышеупомянутых слагаемых во второй раз на =, чтобы извлечь действительное число.Если в данной строке хотя бы одно число больше 5, мы сохраняем его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...