使用gsub()从R中的数组中提取数字

使用gsub()从R中的数组中提取数字,r,regex,gsub,R,Regex,Gsub,我想从以下数组中删除&和,只提取数字 x = as.factor(c(".&.", "0.0119885482338&.&.", ".&2.25880593895", ".&.&.&.&.&.&.&.", ".&0.295142083575&.", "0.708323350364&qu

我想从以下数组中删除&,只提取数字

x = as.factor(c(".&.", "0.0119885482338&.&.", ".&2.25880593895", ".&.&.&.&.&.&.&.", ".&0.295142083575&.", "0.708323350364",".&.&0.193766679861",".&.&.&.&7.65239874523E-4&.&."))
我尝试了以下
gsub()
命令:

gsub("[^0-9.E-]","",x)
输出:

".."                     "0.0119885482338.."      ".2.25880593895"         
"........"              
".0.295142083575."       "0.708323350364"         "..0.193766679861"       
"....7.65239874523E-4.." 
任何更新上述
gsub
命令的建议,以便输出如下所示:

"" "0.0119885482338" "2.25880593895" "" "0.295142083575" 
"0.708323350364" "0.193766679861" "7.65239874523E-4"  
你可以用

>sub(“^.*”(?:([-+]?\\d*\.?\\d+(?:[eE][-+]?\\d+))。。。。。。。。。。。。“\\1”,x)
[1] “0.0119885482338”“2.25880593895”“0.295142083575”“0.708323350364”“0.193766679861”“7.6523987453E-4”

详情:

  • ^
    -字符串的开头
  • *?
    -任何文本,尽可能短
  • (?:
    -启动非捕获组:
    • ([-+]?\\d*\.?\\d+(?:[eE][-+]?\\d+)
      -第1组(
      \1
      ):a
    • *
      -字符串的其余部分
  • |
    • $
      -字符串结尾
  • -非捕获组结束
见:

x=as.因子(c(“.&.”、“0.0119885482338&.”、“&2.25880593895”、“&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.”、“&0.295142083575&.”、“0.708323350364”、“&.&.&0.193766679861”、“&.&7.652398745E-4&.&.)
sub(“^.*?(?:([-+]?\\d*\.?\\d+(?:[eE][-+]?\\d+)
## => [1] ""                 "0.0119885482338"  "2.25880593895"    ""                
##[5]“0.295142083575”“0.708323350364”“0.193766679861”“7.6523987453E-4”

这里是一个基本的R方法,使用
grepl
,然后是
sub

x <- x[grepl("\\d+", x)]
x <- sub("^.*?(\\d+(?:\\.\\d+)?(?:E[-+]\\d+)?).*$", "\\1", x)
x

[1] "0.0119885482338"  "2.25880593895"    "0.295142083575"   "0.708323350364"  
[5] "0.193766679861"   "7.65239874523E-4"

如果希望结果为字符,请在下面的备选方案中删除结尾处的as.numeric

1)以下内容不使用正则表达式。问题中显示的输入形式是&分隔字段,因此它将x从因子转换为字符,将其拆分为以&分隔的字段,删除字段中的任何点,然后将余数转换为数字。没有使用任何软件包

s <- unlist(strsplit(paste(x), "&", fixed = TRUE))
as.numeric(s[s != "."])
## [1] 0.0119885482 2.2588059390 0.2951420836 0.7083233504 0.1937666799
## [6] 0.0007652399
2)如果我们随后删除前导点和尾随点,删除零长度字段并转换为数字,则问题中的方法可以起作用

as.numeric(Filter(nzchar, trimws(gsub("[^0-9.E-]","",x),, whitespace = "\\.")))
## [1] 0.0119885482 2.2588059390 0.2951420836 0.7083233504 0.1937666799
## [6] 0.0007652399
更新 在一篇评论中提到,希望结果与输入长度相同。假设在这种情况下我们需要字符输出,我们可以将上述内容缩短为以下内容:

L <- strsplit(paste(x), "&", fixed = TRUE)
sapply(L, function(x) c(x[x != "."], "")[1])
## [1] ""                 "0.0119885482338"  "2.25880593895"    ""                
## [5] "0.295142083575"   "0.708323350364"   "0.193766679861"   "7.65239874523E-4"

x %>% paste %>% strsplit("&", fixed = TRUE) %>% sapply(function(x) c(x[x != "."], "")[1])
## [1] ""                 "0.0119885482338"  "2.25880593895"    ""                
## [5] "0.295142083575"   "0.708323350364"   "0.193766679861"   "7.65239874523E-4"


trimws(gsub("[^0-9.E-]","",x), whitespace = "\\.")
## [1] ""                 "0.0119885482338"  "2.25880593895"    ""                
## [5] "0.295142083575"   "0.708323350364"   "0.193766679861"   "7.65239874523E-4"
L%paste%>%strsplit(&),fixed=TRUE)%>%sapply(函数(x)c(x[x!=“,”)[1])
## [1] ""                 "0.0119885482338"  "2.25880593895"    ""                
##[5]“0.295142083575”“0.708323350364”“0.193766679861”“7.6523987453E-4”
trimws(gsub(“[^0-9.E-]”,“”,x),空格=“\\”)
## [1] ""                 "0.0119885482338"  "2.25880593895"    ""                
##[5]“0.295142083575”“0.708323350364”“0.193766679861”“7.6523987453E-4”

如果
&
总是在一起(在给定的示例中就是这样),您可以使用
\.&\.

gsub("\\.*&\\.*", "", x)
#[1] ""                 "0.0119885482338"  "2.25880593895"    ""                
#[5] "0.295142083575"   "0.708323350364"   "0.193766679861"   "7.65239874523E-4"

注意:您可能需要进行调整,根据实际数据/要求可能会有所不同。请记住接受下面您最喜欢的答案。我可以使用@wiktorth建议的命令提取所需的输出@Tim提到的命令正在删除缺少的观察(“”)从数组中…为什么还要这些空字符串项?在我将它们转换为数值(使用as.numeric())后,这些空字符串项正在生成NA(这是需要的)。上述数组是数据框中列的一部分,因此需要保留NA观测值,以便进行下游分析。您给出/建议的解决方案对我很有帮助。您好,前两个命令运行良好。最后一个命令在trimws(gsub(“[^0-9.E-]”,“”,x)、whitespace=“\\”:未使用的参数(whitespace=“\\”)中返回错误。更新到R的最新版本。whitespace=已添加到最新版本之一中。或者,如果升级不可行,请使用:
gsub(“^\\.\\.\.*$”,“”),gsub([^0-9.E-],“”,x))
gsub("\\.*&\\.*", "", x)
#[1] ""                 "0.0119885482338"  "2.25880593895"    ""                
#[5] "0.295142083575"   "0.708323350364"   "0.193766679861"   "7.65239874523E-4"