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

Filtering by numerical values in r where dataset is text-based

我试图在这些值大于 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 解释给定值的方法,以便将它们扫描为数字而不是文本或字符。

这是使用 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,那么我们将保留它。

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)

这是一个使用 stringr

中的 str_extract 的选项
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