检查字符串中的多个值中是否有任何值在数值范围R内
我有以下虚拟数据帧:检查字符串中的多个值中是否有任何值在数值范围R内,r,dplyr,R,Dplyr,我有以下虚拟数据帧: structure(list(ref = structure(1:7, .Label = c("a", "b", "c", "d", "e", "f", "g"), class = "factor"), gene = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L), .Label = c("gyrA", "parC"), class = "factor"), result = structure(c(2L, 4L, 6L, 2L
structure(list(ref = structure(1:7, .Label = c("a", "b", "c",
"d", "e", "f", "g"), class = "factor"), gene = structure(c(1L,
1L, 1L, 1L, 1L, 2L, 2L), .Label = c("gyrA", "parC"), class = "factor"),
result = structure(c(2L, 4L, 6L, 2L, 3L, 5L, 1L), .Label = c("S479T",
"S83L", "S83L, D678E, D741E", "S83L, D87G", "T765E", "V196A, M248V, E678D"
), class = "factor")), class = "data.frame", row.names = c(NA,
-7L))
看起来是这样的:
ref gene result
a gyrA S83L
b gyrA S83L, D87G
c gyrA V196A, M248V, E678D
d gyrA S83L
e gyrA S83L, D678E, D741E
f parC T765E
g parC S479T
我想做的是检查“result”列中的数值(每个条目中两个字母之间)是否在特定范围内,特别是67-106,但仅当列“gene”==gyrA时。需要检查“结果”列中每个单元格中的所有数字。
如果单元格中的任何数字在指定范围内,result_pos中的结果应返回1。
我尝试了以下方法:
df %>%
mutate(gyrA_pos = ifelse(gene == "gyrA", gsub("[[:alpha:]]", "", result), NA),
result_pos = ifelse(gene == "gyrA" & gyrA_pos %in% as.character(seq(from = 67, to = 106)) == TRUE, 1, 0))
这是可行的,但仅适用于只有一个值的条目。我还发现,在匹配之前,必须创建一列,并去掉字母,这很乏味。我想以这个结尾:
ref gene result result_pos
a gyrA S83L 1
b gyrA S83L, D87G 1
c gyrA V196A, M248V, E678D 0
d gyrA S83L 1
e gyrA S83L, D678E, D741E 1
f parC T765E NA
g parC S479T NA
这里有一条路。您可以使用
str\u extract\u all
获取结果中的所有数字,而不仅仅是第一个,然后使用map
和any
检查是否有任何数字在指定范围内。最后就是在需要的地方插入NA
,并转换成整数
库(tidyverse)
df%
变异(
结果位置=结果%>%
str\u extract\u all(“\\d+”)%>%
映射(作为整数)%>%
映射lgl(~any(.x>=67L和.x参考基因结果)
#>1 a gyrA S83L 1
#>2 b gyrA S83L,D87G 1
#>3 c gyrA V196A、M248V、E678D 0
#>4 d gyrA S83L 1
#>5 e gyrA S83L、D678E、D741E 1
#>6楼帕洛阿尔托T765E酒店
#>7克parC S479T北美
由(v0.2.0)于2018-09-04创建。这里是一个数据。表选项
library(data.table)
setDT(DF)
DF[, `:=`(result = as.character(result), # coerce result to character
result_pos = NA_integer_)] # set result_pos to NA
DF[gene == 'gyrA', result_pos := {
x <-
lapply(strsplit(result, split = ","),
gsub,
pattern = "\\D+",
replacement = "")
as.integer(sapply(x, function(i)
any(as.numeric(i) >= 67 & as.numeric(i) <= 106)))
}][]
# ref gene result result_pos
#1: a gyrA S83L 1
#2: b gyrA S83L, D87G 1
#3: c gyrA V196A, M248V, E678D 0
#4: d gyrA S83L 1
#5: e gyrA S83L, D678E, D741E 1
#6: f parC T765E NA
#7: g parC S479T NA
库(data.table)
setDT(DF)
DF[,`:=`(result=as.character(result),#将结果强制为character
result_pos=NA_integer_35;将result_pos设置为NA
DF[基因='gyrA',结果位置:={
x=67&作为数字(i)您的示例不清楚,但您是否还希望显示2、3等。如果这些是在所需范围内的?如果有多个result
匹配,应返回什么?@CalumYou如果单元格中的任何数字在指定范围内,result\u pos中的结果应返回1。抱歉由于不清楚,问题已更新。谢谢!简单快速的解决方案。