Best way to test for numeric digits?
There are some answers on Stack Overflow: https://stackoverflow.com/questions/14984989/how-to-avoid-warning-when-introducing-nas-by-coercion
On 2023-10-18 10:59 a.m., Leonard Mada via R-help wrote:
Dear List members,
What is the best way to test for numeric digits?
suppressWarnings(as.double(c("Li", "Na", "K",? "2", "Rb", "Ca", "3")))
# [1] NA NA NA? 2 NA NA? 3
The above requires the use of the suppressWarnings function. Are there
any better ways?
I was working to extract chemical elements from a formula, something
like this:
split.symbol.character = function(x, rm.digits = TRUE) {
?? ?# Perl is partly broken in R 4.3, but this works:
?? ?regex = "(?<=[A-Z])(?![a-z]|$)|(?<=.)(?=[A-Z])|(?<=[a-z])(?=[^a-z])";
?? ?# stringi::stri_split(x, regex = regex);
?? ?s = strsplit(x, regex, perl = TRUE);
?? ?if(rm.digits) {
?? ???? s = lapply(s, function(s) {
?? ???? ??? isNotD = is.na(suppressWarnings(as.numeric(s)));
?? ???? ??? s = s[isNotD];
?? ???? });
?? ?}
?? ?return(s);
}
split.symbol.character(c("CCl3F", "Li4Al4H16", "CCl2CO2AlPO4SiO4Cl"))
Sincerely,
Leonard
Note:
# works:
regex = "(?<=[A-Z])(?![a-z]|$)|(?<=.)(?=[A-Z])|(?<=[a-z])(?=[^a-z])";
strsplit(c("CCl3F", "Li4Al4H16", "CCl2CO2AlPO4SiO4Cl"), regex, perl = T)
# broken in R 4.3.1
# only slightly "erroneous" with stringi::stri_split
regex = "(?<=[A-Z])(?![a-z]|$)|(?=[A-Z])|(?<=[a-z])(?=[^a-z])";
strsplit(c("CCl3F", "Li4Al4H16", "CCl2CO2AlPO4SiO4Cl"), regex, perl = T)
______________________________________________ R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.