В 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