Удаление префикса из строк в кадре данных R

#r #regex #dataframe

Вопрос:

У меня есть фрейм данных wkt_small со следующими данными:

 id             GEOMETRY                                                                                      
  <chr>          <chr>                                                                                         
1 PTK01        LINESTRING( 1.142 85.892 1.400, 0.991 85.892 1.400)
2 PTK02        LINESTRING( 2.142 85.892 1.400, 0.991 85.892 1.400)
...
 

Что мне нужно, так это чтобы это выглядело так:

 id             GEOMETRY                                                                                      
  <chr>          <chr>                                                                                         
1 PTK01        ( 1.142 85.892 1.400, 0.991 85.892 1.400)
2 PTK02        ( 2.142 85.892 1.400, 0.991 85.892 1.400)
...
 

Я попробовал следующее:

 wkt_small[, 2] <- gsub('^\w ', '', wkt_small[, 2])
 

Это, однако, дает мне следующее значение для GEOMETRY для всех строк:

 ("LINESTRING( 1.142 85.892 1.400, 0.991 85.892 1.400, 0.991 85.301 1.4)","LINESTRING( 1.142 85.892 1.400, 0.991 85.892 1.400, 0.991 85.301 1.4)"...
 

объединение значения первой строки со строкой, которую я хочу удалить, для всех записей во фрейме данных.

Ответ №1:

Используйте [[…]] или $… для выбора одного столбца, а не [, …] :

 wkt_small$GEOMETRY <- sub('^\w ', '', wkt_small$GEOMETRY)
 

… на самом деле, при правильном data.frame использовании ваш код также работал бы; но при индексировании с помощью тиббла [ индексация всегда возвращает тиббл, а не вектор столбцов. Семантика тиббла эквивалентна использованию [, …, drop = FALSE] с обычным data.frame .

Комментарии:

1. Я бы предпочел предложить использовать sub вместо gsub этого в данном случае, так как заменяется только одна часть всей строки

2. @Onyambu Да, я полностью согласен (и обычно оставляю такие комментарии ;-)).

3. @Конрад Рудольф, какое регулярное выражение лучше: gsub('^\w ', '', wkt_small$GEOMETRY) против gsub("^.*?\(","\(", wkt_small$GEOMETRY) ? Спасибо.

4. @TarJae Зависит от того, чему именно вы хотите соответствовать. Но в целом я предпочитаю быть как можно более конкретным. Так что, может "^\w \(" быть . В любом случае, обратите внимание на комментарий выше и используйте sub вместо gsub .

Ответ №2:

Обновление: Мы могли бы использовать str_remove (что в данном случае лучше):

 library(stringr)
wkt_small %>% 
    mutate(GEOMETRY = str_remove(GEOMETRY, '^\w '))
 

Мы могли бы использовать str_replace stringr пакет from с регулярным выражением "^[A-Z]*"

 library(dplyr)
library(stringr)
df %>% 
    mutate(GEOMETRY = str_replace(GEOMETRY, "^[A-Z]*", ""))
 

Выход:

   id    GEOMETRY                                 
  <chr> <chr>                                    
1 PTK01 ( 1.142 85.892 1.400, 0.991 85.892 1.400)
2 PTK02 ( 2.142 85.892 1.400, 0.991 85.892 1.400)