[R] Create matrix with column names wiht the same prefix xxxx and that end in 1, 2

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Mon Jul 3 22:02:26 CEST 2023


Às 20:55 de 03/07/2023, Rui Barradas escreveu:
> Às 20:26 de 03/07/2023, Sorkin, John escreveu:
>> Jeff,
>> Again my thanks for your guidance.
>> I replaced dimnames(myvalues)<-list(NULL,c(zzz))
>> with
>> colnames(myvalues)<-zzz
>> and get the same error,
>> Error in dimnames(x) <- dn :
>>    length of 'dimnames' [2] not equal to array extent
>> It appears that I am creating the string zzz in a manner that is not 
>> compatable with either
>> dimnames(myvalues)<-list(NULL,c(zzz))
>> or
>> colnames(myvalues)<-zzz
>>
>> I think I need to modify the way I create the string zzz.
>>
>> # create variable names xxx1 and xxx2.
>> string=""
>> for (j in 1:2){
>>    name <- paste("xxx",j,sep="")
>>    string <- paste(string,name)
>>    print(string)
>> }
>> # Creation of xxx1 and xxx2 works
>> string
>>
>> # Create matrix
>> myvalues <- matrix(nrow=2,ncol=4)
>> head(myvalues,1)
>> # Add "j" and "k" to the string of column names
>> zzz <- paste("j","k",string)
>> zzz
>> # assign column names, j, k, xxx1, xxx2 to the matrix
>> # create column names, j, k, xxx1, xxx2.
>> dimnames(myvalues)<-list(NULL,c(zzz))
>> colnames(myvalues)<-zzz
>> ________________________________________
>> From: Jeff Newmiller <jdnewmil using dcn.davis.ca.us>
>> Sent: Monday, July 3, 2023 2:45 PM
>> To: Sorkin, John
>> Cc: r-help using r-project.org
>> Subject: Re: [R]  Create matrix with column names wiht the same prefix 
>> xxxx and that end in 1, 2
>>
>> I really think you should read that help page.  colnames() accesses 
>> the second element of dimnames() directly.
>>
>> On July 3, 2023 11:39:37 AM PDT, "Sorkin, John" 
>> <jsorkin using som.umaryland.edu> wrote:
>>> Jeff,
>>> Thank you for your reply.
>>> I should have said with dim names not column names. I want the Mateix 
>>> to have dim names, no row names, dim names j, k, xxx1, xxx2.
>>>
>>> John
>>>
>>> John David Sorkin M.D., Ph.D.
>>> Professor of Medicine
>>> Chief, Biostatistics and Informatics
>>> University of Maryland School of Medicine Division of Gerontology and 
>>> Geriatric Medicine
>>> Baltimore VA Medical Center
>>> 10 North Greene Street<x-apple-data-detectors://12>
>>> GRECC<x-apple-data-detectors://12> (BT/18/GR)
>>> Baltimore, MD 21201-1524<x-apple-data-detectors://13/0>
>>> (Phone) 410-605-711<tel:410-605-7119>9
>>> (Fax) 410-605-7913<tel:410-605-7913> (Please call phone number above 
>>> prior to faxing)
>>>
>>> On Jul 3, 2023, at 2:11 PM, Jeff Newmiller <jdnewmil using dcn.davis.ca.us> 
>>> wrote:
>>>
>>> ?colnames
>>>
>>> On July 3, 2023 11:00:32 AM PDT, "Sorkin, John" 
>>> <jsorkin using som.umaryland.edu> wrote:
>>> I am trying to create an array, myvalues, having 2 rows and 4 
>>> columns, where the column names are j,k,xxx1,xxx2. The code below 
>>> fails, with the following error, "Error in dimnames(myvalues) <- 
>>> list(NULL, zzz) :
>>> length of 'dimnames' [2] not equal to array extent"
>>>
>>> Please help me get the code to work.
>>>
>>> Thank you,
>>> John
>>>
>>> # create variable names xxx1 and xxx2.
>>> string=""
>>> for (j in 1:2){
>>> name <- paste("xxx",j,sep="")
>>> string <- paste(string,name)
>>> print(string)
>>> }
>>> # Creation of xxx1 and xxx2 works
>>> string
>>>
>>> # Create matrix
>>> myvalues <- matrix(nrow=2,ncol=4)
>>> head(myvalues,1)
>>> # Add "j" and "k" to the string of column names
>>> zzz <- paste("j","k",string)
>>> zzz
>>> # assign column names, j, k, xxx1, xxx2 to the matrix
>>> # create column names, j, k, xxx1, xxx2.
>>> dimnames(myvalues)<-list(NULL,zzz)
>>>
>>>
>>> ______________________________________________
>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> 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.
>>>
>>> -- 
>>> Sent from my phone. Please excuse my brevity.
>>>
>>> ______________________________________________
>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> 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.
>>
>> -- 
>> Sent from my phone. Please excuse my brevity.
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.
> Hello,
> 
> I should have pointed out in my answer that you are inded creating the 
> names vector in a (very) wrong way. When in the loop you paste string 
> and name you create one vector of length 1. When the loop ends, you have 
> " xxx1 xxx2", not two names.
> 
> 
> string=""
> for (j in 1:2){
>    name <- paste("xxx",j,sep="")
>    string <- paste(string,name)
>    print(string)
> }
> #> [1] " xxx1"
> #> [1] " xxx1 xxx2"
> # Creation of xxx1 and xxx2 works
> string
> #> [1] " xxx1 xxx2"
> 
> 
> 
> Quoting the comment above,
> 
>    Creation of xxx1 and xxx2 works
> 
> No, it does not!
> And then you paste again, adding two extra letters to one string
> 
> zzz <- paste("j","k",string)
> 
> 
> This zzz also is of length 1, check it.
> 
> 
> With a loop the right way would be any of
> 
> # 1. concatenate the current name with string
> string <- NULL   # or c(), perhaps more frequent
> for (j in 1:2){
>    name <- paste("xxx",j,sep="")
>    string <- c(string, name)
>    print(string)
> }
> #> [1] "xxx1"
> #> [1] "xxx1" "xxx2"
> # Now creation of xxx1 and xxx2 does work
> string
> #> [1] "xxx1" "xxx2"
> 
> 
> 
> # 2. create a vector of the appropriate length beforehand, my preferred
> string <- character(2)
> for (j in 1:2){
>    string[j] <- paste0("xxx",j,sep="")
>    print(string)
> }
> #> [1] "xxx1" ""
> #> [1] "xxx1" "xxx2"
> # Creation of xxx1 and xxx2 works
> string
> #> [1] "xxx1" "xxx2"
> 
> 
> 
> But the vectorized way is still the better one.
> 
> Hope this helps,
> 
> Rui Barradas
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
Hello,

The notation in my first post doesn't follow the OP's, so here is a MWE 
corrected.


myvalues <- matrix(nrow=2,ncol=4)

string <- paste0("xxx", 1:2)
length(string)
#> [1] 2
string
#> [1] "xxx1" "xxx2"

zzz <- c("j", "k", string)
length(zzz)
#> [1] 4
zzz
#> [1] "j"    "k"    "xxx1" "xxx2"

# with colnames
colnames(myvalues) <- zzz

# with dimnames
dimnames(myvalues) <- list(NULL, zzz)

myvalues
#>       j  k xxx1 xxx2
#> [1,] NA NA   NA   NA
#> [2,] NA NA   NA   NA



Hope this helps,

Rui Barradas



More information about the R-help mailing list