В R, используйте gsub для удаления всех знаков препинания, кроме периода
Я новичок в R, поэтому надеюсь, что вы сможете мне помочь.
Я хочу использовать gsub для удаления всех знаков препинания, за исключением знаков периодов и минус, поэтому я могу хранить десятичные точки и отрицательные символы в своих данных.
Пример
Мой кадр данных z имеет следующие данные:
[,1] [,2]
[1,] "1" "6"
[2,] "[email protected]" "7.235"
[3,] "3" "8"
[4,] "4" "$9"
[5,] "£5" "-10"
Я хочу использовать gsub("[[:punct:]]", "", z)
для удаления пунктуации.
Текущий выход
> gsub("[[:punct:]]", "", z)
[,1] [,2]
[1,] "1" "6"
[2,] "2" "7235"
[3,] "3" "8"
[4,] "4" "9"
[5,] "5" "10"
Я хотел бы, однако, сохранить знак "-" и ".". знак.
Желаемый вывод
PSEUDO CODE:
> gsub("[[:punct:]]", "", z, except(".", "-") )
[,1] [,2]
[1,] "1" "6"
[2,] "2" "7.235"
[3,] "3" "8"
[4,] "4" "9"
[5,] "5" "-10"
Любые идеи, как я могу заставить некоторые символы освобождаться от функции gsub()?
Ответы
Ответ 1
Вы можете вернуть несколько совпадений следующим образом:
sub("([.-])|[[:punct:]]", "\\1", as.matrix(z))
X..1. X..2.
[1,] "1" "6"
[2,] "2" "7.235"
[3,] "3" "8"
[4,] "4" "9"
[5,] "5" "-10"
Здесь я сохраняю .
и -
.
И я предполагаю, что следующий шаг - заставить вас привести к числовой матрице, SO здесь. Я совмещаю следующие два шага:
matrix(as.numeric(sub("([.-])|[[:punct:]]", "\\1", as.matrix(z))),ncol=2)
[,1] [,2]
[1,] 1 6.000
[2,] 2 7.235
[3,] 3 8.000
[4,] 4 9.000
[5,] 5 -10.000
Ответ 2
Еще один способ подумать о том, что вы хотите сохранить? Вы можете использовать регулярные выражения как для сохранения информации, так и для ее исключения. У меня много кадров данных, которые мне нужно очистить единицы и конвертировать из нескольких строк за один проход, и мне легче всего использовать что-то из семейства apply
в этих случаях.
Воссоздание примера:
a <- c('1', '[email protected]', '3', '4', '£5')
b <- c('6', '7.235', '8', '$9', '-10')
z <- matrix(data = c(a, b), nrow = length(a), ncol=2)
Затем используйте apply
в сочетании с gsub
.
apply(z, 2, function(x) as.numeric(gsub('[^0-9\\.\\-]', '', x)))
[,1] [,2]
[1,] 1 6.000
[2,] 2 7.235
[3,] 3 8.000
[4,] 4 9.000
[5,] 5 -10.000
Это указывает, что R соответствует всем, кроме цифр, периодов и дефис/тире. Лично я нахожу его более чистым и простым в использовании в этих ситуациях и дает тот же результат.
Кроме того, в документации есть хорошее объяснение этих мощных, но запутанных регулярных выражений.
https://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html
Или ?regex