У меня есть такой вектор:
vec <- c("a + 17", "äÜ - 20*3")
Есть разные буквы, цифры и операторы. Я хочу избавиться от букв. Или, наоборот, оставить только цифры и операторов. Вот результат, который я ищу:
c("17", "-20*3")
Я пробовал gsub("[:alpha:]", "", vec), но это не работает, и я не понимаю, почему, потому что [:alpha:] должен удалить все буквы, и тогда я должен получить вектор, который я ищу. Но это не так.
Я нашел похожий вопрос но мне он тоже не помог.
@dufei ошибка. Обновленный вопрос





Да, вы можете добиться этого с помощью gsub, но ваше регулярное выражение было неверным. Попробуйте применить следующий:
vec <- c("a + 17", "djdj - 20*3 + äÜ - 2")
vec <- gsub("[[:alpha:]]+", "", vec) # remove one or more letters
vec <- gsub("\\s+", "", vec) # remove whitespace
или даже
gsub("[^0-9\\*\\+\\-\/]+", "", vec) # remove all that isn't a number, minus, divide, times, plus or whitespace
@IngoPingo, в первом регулярном выражении нет, да, но второе удаляет, не так ли?
Вот подход без регулярных выражений. Начиная с вашего вектора:
vec <- c("a + 17", "äÜ - 20*3")
Сначала определите список разрешенных символов:
good <- c(0:9, "+", "-", "*", "/", "^")
Затем разделите векторы на символьные элементы и сохраните только те, которые пересекаются:
vec <- lapply(strsplit(vec, ""), \(x) x[x %in% good])
Наконец - соедините элементы вместе:
vec <- sapply(vec, paste0, collapse = "")
vec
[1] "+17" "-20*3"
Творческий! У меня не было идеи использовать strsplit() +1
Вот другой подход с использованием gsub:
x <- gsub("[^0-9+-/*]", "", vec)
c(as.numeric(x)[1], x[2])
выход:
[1] "17" "-20*3"
Warning message:
NAs introduced by coercion
Это волшебство :D Теперь я не понимаю, почему это не работало до того, что я пробовал.. Почему мы можем помещать такие символы, как +, не экранируя? Я думал, что + будет означать один или несколько, а не знак плюса.
Не было бы чище запустить x <- sub("^\\+", "", x) вместо вызова as.numeric() с предупреждениями NA?
gsub("[^0-9+-/*]", "", "a+") дает "+", поэтому +, очевидно, на самом деле означает «ищите знак плюс». Это меня удивляет, потому что я думал, что это будет означать «один или несколько»..
@Каролис Концевичюс. Я получаю [1] "17" "-20*3+-2", используя ваш подход?!
@ИнгоПинго. Вы правы: "+", "-", "*", and "/" в квадратных скобках соответствуют этим операторам.
Какова логика исключения знака плюс в желаемом результате?