首页 > 解决方案 > 按 r 中的数值过滤,其中数据集是基于文本的

问题描述

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

标签: rtextfiltersubsetnumeric

解决方案


这是使用applywith的基本 R 方法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 的数字,那么我们保留它。


推荐阅读