[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 21:55:20 CEST 2023


À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



More information about the R-help mailing list