Регулярное выражение не может найти ноль после десятичной точки в tidyr :: extract. Можете ли вы угадать причину, почему? - PullRequest
0 голосов
/ 02 апреля 2020
'''
df <- data.frame(x = c(1.2, 3.4, 0.6, 7.0, 0.0))  
extract(df, x, c("integer", "fractional"), "(\\d+)\\.(\\d+)")  
extract(df, x, c("integer", "fractional"), "([0-9]+)\\.([0-9]+)")  
'''  

Результат:

integer fractional  
       1          2  
       3          4  
       0          6  
    NA       NA  
    NA       NA  

для обоих регулярных выражений.
Значения типа 7.0, 0.0 неправильно разделены на extract().

Почему можно ' t \\d+ взять нулевые цифры после десятичной точки?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Я думаю, что проблема связана с тем фактом, что ноль после точки преобразуется в пустой символ "". Вот очень эффективное и быстрое решение с data.table и stringr , хотя и более многословным. Мне нравится многословие, если оно сочетается со скоростью и эффективностью, что происходит от языка set().

library(data.table)

df <- data.frame( x = c(1.2, 3.4, 0.6, 7.0, 0.0) )  
dt = as.data.table( str_split( df$x, pattern = "\\.", simplify = TRUE ) )
for(col in names(dt)) { 
  set(dt, i = which( dt[[ col ]] == "" ), j = col, value = "0")
}
setnames( dt, names(dt), c( "integer", "fractional" ) )
> dt
   integer fractional
1:       1          2
2:       3          4
3:       0          6
4:       7          0
5:       0          0

Обратите внимание, что str_split() делает именно то, что я сказал выше. Посмотрите ниже:

> str_split( df$x, pattern = "\\.", simplify = TRUE )
     [,1] [,2]
[1,] "1"  "2" 
[2,] "3"  "4" 
[3,] "0"  "6" 
[4,] "7"  ""  
[5,] "0"  ""  

Как видите, десятичных нулей больше нет!

0 голосов
/ 02 апреля 2020

Здесь регулярное выражение не было проблемой.
Когда я набираю df, оно показывает
x
1,2
3,4
0,6
7,0
0,0
Однако, когда при извлечении заглянуть в df $ x [5], оно становится равным 7.
Таким же образом, df $ x [6] становится равным 0.
Таким образом, извлечение не выполняется для этих двух значений.
Чтобы решить эту проблему, вы можете использовать «0.0» вместо 0.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...