我试图过滤这些值大于 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 来解释给定的值,以便将它们扫描为数字而不是文本或字符。
答案 0 :(得分:0)
以下是使用apply
和strsplit
的基本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