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.

Reply via email to