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

107

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

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

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

ЛукасСеверин
источник

Ответы:

116

Вот пример того, что я бы сделал. Надеюсь, это то, что вы ищете.

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)

теперь должен содержать:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4
nfmcclure
источник
Как ни странно, мне пришлось изменить -3на, -0чтобы добиться желаемого эффекта! У меня много данных с датами, например: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- да, два часовых пояса вместе, а функция as.Date возвращает неожиданные результаты (на день раньше для дат BST) - поэтому я хотел удалить отметку часового пояса, оказывается, мне нужно делаю -0и он исчезает вместе с часами
LucasSeveryn
Также рассмотрите функцию strptime, хотя я раньше не использовал часовые пояса. Я думаю, он мог бы это узнать. Предположительно "% Z" распознает часовые пояса. Я также удалил функцию sapply. Я забыл, как R любит векторизовать свои функции.
nfmcclure
@LucasSeveryn Если вы хотите преобразовать символьные представления времени в даты с учетом часовых поясов, отредактируйте это в своем вопросе. Вероятно, есть лучшие ответы, которые приведут вас непосредственно к желаемым результатам (например, strptime).
Blue Magister
85

Вот способ gsub:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"
Мэтью Plourde
источник
4
(+1) Большой поклонник регулярных выражений. Его можно использовать практически на всем.
Rich Scriven
8
Примечание. Возвращает исходную строку, если она длиннее, чем количество символов, которые нужно вырезать. Посмотрим gsub('.{5}$', '', 'abcd').
Томас Грейф
32

Хотя это в основном то же самое с ответом @nfmcclure, я предпочитаю использовать stringrпакет, поскольку он предоставляет набор функций, имена которых наиболее согласованы и описательны, чем имена в базе R (на самом деле я всегда гуглил, «как получить количество буквы R ", так как я не могу вспомнить название nchar()).

library(stringr)
str_sub(iris$Species, end=-4)
#or 
str_sub(iris$Species, 1, str_length(iris$Species)-3)

Это удаляет последние 3 символа из каждого значения в Speciesстолбце.

Blaszard
источник
22
с stringrпакетом есть еще более простое решение: str_sub(iris$Species, end=-4)
jan-glx
14

То же самое может быть достигнуто с помощью пакета 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" 
гаголевы
источник
3

Подобно @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возвращается исходная неизмененная строка.

NB использование {,3}было бы эквивалентно {0,3}, я просто предпочитаю последнее обозначение.

См. Дополнительную информацию о квантификаторах регулярных выражений: https://www.regular-expressions.info/refrepeat.html

крадс
источник
Вы можете использовать sub()вместо gsub().
sindri_baldur