[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