Como remover os últimos n caracteres de cada elemento no vetor R

106

Eu sou muito novo no R e não consegui encontrar um exemplo simples online de como remover os últimos n caracteres de cada elemento de um vetor (matriz?)

Eu venho de um background de Java, então o que eu gostaria de fazer é iterar sobre cada elemento a$datae remover os últimos 3 caracteres de cada elemento.

Como você faria isso?

LucasSeveryn
fonte

Respostas:

115

Aqui está um exemplo do que eu faria. Espero que seja o que você está procurando.

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 agora deve conter:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4
nfmcclure
fonte
Engraçado, tive que mudar -3para -0para obter o efeito desejado! Eu tenho muitos dados com datas, como: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- sim, dois fusos horários juntos, e a função as.Date está retornando resultados inesperados (dia anterior para datas BST) - portanto, eu queria remover o carimbo de fuso horário, descobri que preciso faz -0e desaparece, junto com horas
LucasSeveryn
Considere também a função strptime, mas nunca usei fusos horários antes. Acho que pode reconhecê-lo. Supostamente, "% Z" reconhece fusos horários. Eu também removi a função sapply. Esqueci o quanto R gosta de vetorizar suas funções.
nfmcclure
@LucasSeveryn Se você deseja converter representações de tempo de caracteres em datas levando em consideração fusos horários, edite isso em sua pergunta. É provável que haja respostas melhores que o levarão diretamente aos resultados desejados (como strptime).
Blue Magister
84

Aqui está uma maneira de gsub:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"
Matthew Plourde
fonte
4
(+1) Grande fã de regex. Pode ser usado em quase tudo.
Rich Scriven
8
Nota: Isso retorna a string original se for maior que o número de caracteres a serem cortados. Considere gsub('.{5}$', '', 'abcd').
Tomas Greif
32

Embora seja basicamente o mesmo com a resposta de @nfmcclure, eu prefiro usar o stringrpacote, pois fornece um conjunto de funções cujos nomes são mais consistentes e descritivos do que aqueles na base R (na verdade, eu sempre busco "como obter o número de caracteres em R " porque não me lembro o nome nchar()).

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

Isso remove os últimos 3 caracteres de cada valor na Speciescoluna.

Blaszard
fonte
22
com o stringrpacote existe uma solução ainda mais simples: str_sub(iris$Species, end=-4)
jan-glx
13

O mesmo pode ser alcançado com o pacote 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" 
gagolews
fonte
2

Semelhante a @Matthew_Plourde usando gsub

No entanto, usando um padrão que cortará para zero caracteres, ou seja, retornará "" se a string original for menor que o número de caracteres a serem cortados:

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

A diferença é que o {0,3}quantificador indica 0 a 3 correspondências, ao passo que {3}requer exatamente 3 correspondências, caso contrário, nenhuma correspondência será encontrada, caso em que gsubretorna a string original não modificada.

NB using {,3}seria equivalente a {0,3}, simplesmente prefiro a última notação.

Veja aqui mais informações sobre quantificadores regex: https://www.regular-expressions.info/refrepeat.html

krads
fonte