Sorkin, John
2023-Jul-03 20:08 UTC
[R] Create a variable lenght string that can be used in a dimnames statement
Colleagues, I am sending this email again with a better description of my problem and the area where I need help. I need help creating a string of variables that will be accepted by the dimnames function. The string needs to start with the dimnames j and k followed by a series of dimnames xxx1, . . . ., xxx2, . . ., xxxn. I create xxx1, xxx2 (not going to xxxn to shorten the code below) as a string using a for loop and the paste function. I then use a paste function, zzz <- paste("j","k",string) to create the full set of dimnames, j, k, xxx1, xxx2 as string. I create the matrix myvalues in the usual way and attempt to assign dim names to the matrix using the following dimnames statement, dimnames(myvalues)<-list(NULL,c(zzz)) The dimnames statement leads to the following error, Error in dimnames(x) <- dn : length of 'dimnames' [2] not equal to array extent A colnames statement, colnames(myvalues)<-as.character(zzz) produces the same error. Can someone tell me how to create a sting that can be used in the dimnames statment? Thank you (and please accept my apologies for double posting). 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,c(zzz)) colnames(myvalues) <- string
Bert Gunter
2023-Jul-03 20:40 UTC
[R] Create a variable lenght string that can be used in a dimnames statement
I am not going to try to sort out your confusion, as others have already tried and failed. But I will point out that "string" of variables is pretty much nonsense in R. A "character vector"/"vector of strings" is probably what you mean and want to provide column names // names for the second component of the dim list for a matrix. e.g.> m <- matrix(1:6, nr=3) > m[,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6> dimnames(m)NULL> dimnames(m) <- list(letters[1:3], c('foo','bar')) > mfoo bar a 1 4 b 2 5 c 3 6 Cheers, Bert On Mon, Jul 3, 2023 at 1:10?PM Sorkin, John <jsorkin at som.umaryland.edu> wrote:> Colleagues, > > I am sending this email again with a better description of my problem and > the area where I need help. > > I need help creating a string of variables that will be accepted by the > dimnames function. The string needs to start with the dimnames j and k > followed by a series of dimnames xxx1, . . . ., xxx2, . . ., xxxn. I create > xxx1, xxx2 (not going to xxxn to shorten the code below) as a string using > a for loop and the paste function. I then use a paste function, zzz <- > paste("j","k",string) to create the full set of dimnames, j, k, xxx1, xxx2 > as string. I create the matrix myvalues in the usual way and attempt to > assign dim names to the matrix using the following dimnames statement, > dimnames(myvalues)<-list(NULL,c(zzz)) > The dimnames statement leads to the following error, > Error in dimnames(x) <- dn : > length of 'dimnames' [2] not equal to array extent > A colnames statement, > colnames(myvalues)<-as.character(zzz) > produces the same error. > > Can someone tell me how to create a sting that can be used in the dimnames > statment? > > Thank you (and please accept my apologies for double posting). > > 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,c(zzz)) > colnames(myvalues) <- string > ______________________________________________ > R-help at 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. >[[alternative HTML version deleted]]
Ebert,Timothy Aaron
2023-Jul-04 01:24 UTC
[R] Create a variable lenght string that can be used in a dimnames statement
At least on my system string has a single value of " xxx1 xxx2" not "xxx1" and "xxx2". The variable zzz has two values: "J K xxx1" and "J K xxx2" What you want is "J", "K", "xxx1", "xxx2" If I cheat everything works. So then the goal is to rewrite the program so cheating is not needed. # 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 string = c("xxx1","xxx2") #Cheating # 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) # assign column names, j, k, xxx1, xxx2 to the matrix # create column names, j, k, xxx1, xxx2. zzz<-c("J", "K", "xxx1", "xxx2") #Cheating again dimnames(myvalues)<-list(NULL,c(zzz)) Here is one version that runs without cheating # create variable names xxx1 and xxx2. string="" for (j in 1:2){ string[j] <- paste("xxx",j,sep="") print(string) } # Creation of xxx1 and xxx2 works string # Create matrix myvalues <- matrix(nrow=2,ncol=4) zzz <- c("j","k",string) # assign column names, j, k, xxx1, xxx2 to the matrix # create column names, j, k, xxx1, xxx2. dimnames(myvalues)<-list(NULL,c(zzz)) Regards, Tim -----Original Message----- From: R-help <r-help-bounces at r-project.org> On Behalf Of Sorkin, John Sent: Monday, July 3, 2023 4:08 PM To: r-help at r-project.org (r-help at r-project.org) <r-help at r-project.org> Subject: [R] Create a variable lenght string that can be used in a dimnames statement [External Email] Colleagues, I am sending this email again with a better description of my problem and the area where I need help. I need help creating a string of variables that will be accepted by the dimnames function. The string needs to start with the dimnames j and k followed by a series of dimnames xxx1, . . . ., xxx2, . . ., xxxn. I create xxx1, xxx2 (not going to xxxn to shorten the code below) as a string using a for loop and the paste function. I then use a paste function, zzz <- paste("j","k",string) to create the full set of dimnames, j, k, xxx1, xxx2 as string. I create the matrix myvalues in the usual way and attempt to assign dim names to the matrix using the following dimnames statement, dimnames(myvalues)<-list(NULL,c(zzz)) The dimnames statement leads to the following error, Error in dimnames(x) <- dn : length of 'dimnames' [2] not equal to array extent A colnames statement, colnames(myvalues)<-as.character(zzz) produces the same error. Can someone tell me how to create a sting that can be used in the dimnames statment? Thank you (and please accept my apologies for double posting). 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,c(zzz)) colnames(myvalues) <- string ______________________________________________ R-help at 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.
Ivan Krylov
2023-Jul-04 07:14 UTC
[R] Create a variable lenght string that can be used in a dimnames statement
On Mon, 3 Jul 2023 20:08:06 +0000 "Sorkin, John" <jsorkin at som.umaryland.edu> wrote:> # 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 > stringYou need to distinguish between a space separated string and a string vector. A space separated string is a single object that R won't split for you unless you tell it to. (Are you coming from a Unix background? A command line shell will split a space-separated string into a list of words unless you tell it not to do that, but that's because its main job is to convert space separated command lines typed by the operator into lists of command line arguments. R is not like that at all.) What you're getting here is an individual string. You can confirm that by typing: string[1] and still seeing the whole string. You can also type: string[2] and see an NA instead of the second word in the string. Try replacing the _second_ paste() in the example above with a c(). Given individual strings, paste() concatenates its arguments into a string. c() concatenates its arguments into a vector of separate objects. You should still get a variable named `string`, but when you print it whole, the results will look different (R will separate the two strings inside that vector), and you should be able to type string[1] and string[2] and get "xxx1" and "xxx2" respectively. What about Rui's solution, the one that used paste() and got a vector, contrary to what I wrote above? Rui gave a vector to paste(). paste() runs a loop inside it and produces a string for every vector element of it encounters, unless you tell it to collapse the result.> zzz <- paste("j","k",string)Same thing here. paste() adds spaces and returns a string. You need c() to retain "j" and "k" separate from "xxx1" and "xxx2" as individual elements of the vector. It may *look* similar ([1] "j k xxx1 xxx2" vs. [1] "j" "k" "xxx1" "xxx2"), but the resulting objects are different. When in doubt, use str() on an object to see its structure. -- Best regards, Ivan