Sorted! Thanks everybody!
2010/4/30 Marc Schwartz <marc_schwa...@me.com>: > Dang it....you are right Greg. > > names <- c("ABC", "ABCD", "ABCDE", "ABCDEF") > >> substr(names, 1, nchar(names) - 1) > [1] "AB" "ABC" "ABCD" "ABCDE" > > > and...that is faster than using gsub(). > > > Thanks for catching that....now it's time for cawfee.... > > Marc > > > On Apr 30, 2010, at 6:28 PM, Greg Snow wrote: > >> No, substr is vectorized, you just have a typo, you are using a different >> vector for nchar than you are subsetting. >> >> -- >> Gregory (Greg) L. Snow Ph.D. >> Statistical Data Center >> Intermountain Healthcare >> greg.s...@imail.org >> 801.408.8111 >> >> >>> -----Original Message----- >>> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r- >>> project.org] On Behalf Of Marc Schwartz >>> Sent: Friday, April 30, 2010 5:04 PM >>> To: Sebastian Kruk >>> Cc: r-help@r-project.org; r-h...@stat.math.ethz.ch >>> Subject: Re: [R] drop last character in a names'vector >>> >>> >>> On Apr 30, 2010, at 5:44 PM, Sebastian Kruk wrote: >>> >>>> Hi, i have a vector filled with names: >>>> >>>> [1] Alvaro Adela ... >>>> [25] Beatriz Berta ... >>>> ... >>>> [100000] ... >>>> >>>> I would like to drop last character in every name. >>>> >>>> I use the next program: >>>> >>>> for (i in 1:100000) { >>>> largo <- nchar(names[i]-1) >>>> names[i] <- substring (names[i],1,largo] >>>> } >>>> >>>> Is another and faster way of do it? >>>> >>>> Thanks, >>>> >>>> Sebastián. >>> >>> >>> As is the case with R, more than one, but the fastest may be: >>> >>> names <- c("Alvaro Adela", "Beatriz Berta") >>> >>>> gsub("^(.*).{1}$", "\\1", names) >>> [1] "Alvaro Adel" "Beatriz Bert" >>> >>> >>> Just to show that it works with entries of varying lengths: >>> >>>> gsub("^(.*).{1}$", "\\1", c("ABC", "ABCD", "ABCDE", "ABCDEF")) >>> [1] "AB" "ABC" "ABCD" "ABCDE" >>> >>> >>> See ?gsub and ?regex >>> >>> >>> >>> You could use substr(), but the arguments for substring lengths are not >>> vectorized, so the following won't work: >>> >>>> substr(c("ABC", "ABCD", "ABCDE", "ABCDEF"), 1, nchar(names) - 1) >>> [1] "ABC" "ABCD" "ABCDE" "ABCDEF" >>> >>> >>> You would have to do something like this: >>> >>>> as.vector(sapply(c("ABC", "ABCD", "ABCDE", "ABCDEF"), >>> function(x) substr(x, 1, nchar(x) - 1))) >>> [1] "AB" "ABC" "ABCD" "ABCDE" >>> >>> >>> See ?substr and ?nchar >>> >>> HTH, >>> >>> Marc Schwartz > > ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.