[R] drop last character in a names'vector

Sebastian Kruk residuo.solow at gmail.com
Sat May 1 02:43:39 CEST 2010


Sorted!

Thanks everybody!

2010/4/30 Marc Schwartz <marc_schwartz en 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.snow en imail.org
>> 801.408.8111
>>
>>
>>> -----Original Message-----
>>> From: r-help-bounces en r-project.org [mailto:r-help-bounces en r-
>>> project.org] On Behalf Of Marc Schwartz
>>> Sent: Friday, April 30, 2010 5:04 PM
>>> To: Sebastian Kruk
>>> Cc: r-help en r-project.org; r-help en 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
>
>



More information about the R-help mailing list