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