Как удалить последние n символов из каждого элемента вектора R


Я очень новичок в R, и я не мог найти простой пример онлайн того, как удалить последние n символов из каждого элемента вектора (массива?)

Я пришел из фона Java, поэтому то, что я хотел бы сделать, это перебирать каждый элемент a$data и удалить последние 3 символа из каждого элемента.

Как бы вы это сделали?

5 58

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