Как удалить последние n символов из каждого элемента вектора R
Я очень новичок в R, и я не мог найти простой пример онлайн того, как удалить последние n символов из каждого элемента вектора (массива?)
Я пришел из фона Java, поэтому то, что я хотел бы сделать, это перебирать каждый элемент a$data
и удалить последние 3 символа из каждого элемента.
Как бы вы это сделали?
5 ответов:
вот пример того, что я бы сделал. Я надеюсь, что это то, что вы ищете.
char_array = c("foo_bar","bar_foo","apple","beer") a = data.frame("data"=char_array,"data2"=1:4) a$data = substr(a$data,1,nchar(a$data)-3)
a теперь должно содержать:
data data2 1 foo_ 1 2 bar_ 2 3 ap 3 4 b 4
вот способ с
gsub
:cs <- c("foo_bar","bar_foo","apple","beer") gsub('.{3}$', '', cs) # [1] "foo_" "bar_" "ap" "b"
хотя это в основном то же самое с ответом @nfmcclure, я предпочитаю использовать
stringr
пакет как он provdies набор функций, имена которых являются наиболее последовательными и описательными, чем те, что в базе R (на самом деле я всегда google для "как получить количество символов в R" как я не могу вспомнить имяnchar()
).library(stringr) str_sub(iris$Species, 1, str_length(iris$Species)-3)
это удаляет последние 3 символа из каждого значения в .
то же самое может быть достигнуто с stringi:
library('stringi') char_array <- c("foo_bar","bar_foo","apple","beer") a <- data.frame("data"=char_array, "data2"=1:4) (a$data <- stri_sub(a$data, 1, -4)) # from the first to the last but 4th char ## [1] "foo_" "bar_" "ap" "b"
похоже на @Matthew_Plourde с помощью
gsub
однако, используя шаблон, который будет обрезать до нуля символов, т. е. возвращает "", если исходная строка короче чем количество символов сократить:
cs <- c("foo_bar","bar_foo","apple","beer","so","a") gsub('.{0,3}$', '', cs) # [1] "foo_" "bar_" "ap" "b" "" ""
разница в том, что
{0,3}
Квантор указывает от 0 до 3 совпадений, тогда как{3}
требуется ровно 3 совпадения в противном случае совпадение не найдено в этом случаеgsub
возвращает исходную, неизмененную строку.N. B. используя
{,3}
было бы эквивалентно{0,3}
, Я просто предпочитаю последнее обозначение.смотрите здесь дополнительную информацию о кванторах регулярных выражений: https://www.regular-expressions.info/refrepeat.html