#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)