使用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”
看
详情:
-字符串的开头^
-任何文本,尽可能短*?
-启动非捕获组:(?:
-第1组(([-+]?\\d*\.?\\d+(?:[eE][-+]?\\d+)
):a\1
-字符串的其余部分*
|
-字符串结尾$
-非捕获组结束)
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"