Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查字符串中的多个值中是否有任何值在数值范围R内_R_Dplyr - Fatal编程技术网

检查字符串中的多个值中是否有任何值在数值范围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。抱歉由于不清楚,问题已更新。谢谢!简单快速的解决方案。