Як видалити останні n символів з кожного елемента з вектора R


106

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

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

Як би ти про це пішов?

Відповіді:


115

Ось приклад того, що я б робив. Я сподіваюся, що це те, що ви шукаєте.

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

Funnily, мені довелося змінити , -3щоб -0отримати бажаний ефект! У мене є багато даних із датами, наприклад: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- так, два часових пояса разом, а функція as.Date повертає несподівані результати (на день раніше для дат BST) - тому я хотів видалити штамп часового поясу, виявляється, я повинен зроби, -0і він зникає разом із годинами
ЛукасСеверин

Також врахуйте функцію strptime, я раніше не використовував часові пояси. Я думаю, що це може визнати. Нібито "% Z" розпізнає часові пояси. Я також видалив функцію sapply. Я забув, наскільки R любить векторизувати його функції.
nfmcclure

@LucasSeveryn Якщо ви хочете перетворити подання символів часу на дати з урахуванням часових поясів, відредагуйте це у своєму запитанні. Ймовірно, є кращі відповіді, які допоможуть вам отримати бажані результати (наприклад, strptime).
Blue Magister

84

Ось спосіб із gsub:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"

4
(+1) Великий фанат регексу. Його можна використовувати майже на всьому.
Rich Scriven

8
Примітка: Це повертає початковий рядок, якщо він довший, ніж кількість символів для вирізання. Розглянемо gsub('.{5}$', '', 'abcd').
Томаш Грейф

32

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

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

Це видаляє останні 3 символи з кожного значення Speciesстовпця.


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повертається початковий, немодифікований рядок.

Примітка: використання {,3}було б рівнозначно {0,3}, я просто віддаю перевагу останнім позначенням.

Дивіться тут для отримання додаткової інформації про кількісні показники regex: https://www.regular-expressions.info/refrepeat.html


Ви можете використовувати sub()замість gsub().
sindri_baldur
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.