按r中的数值过滤,其中数据集基于文本

时间:2019-02-10 04:10:17

标签: r text filter subset numeric

我试图过滤这些值大于 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 :(得分:0)

以下是使用applystrsplit的基本R方法:

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的整数,那么我们将保留它。

答案 1 :(得分:0)

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)

答案 2 :(得分:0)

这是使用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