Re: [R] Create a variable lenght string that can be used in a dimnames statement
Interesting to read all the answers. Personally, I was a bit irked to see that using a combination of assignments using rownames() and colnames() did not work as one canceled what the other had done. But it turns out if we listed to what John really wanted versus what he said he wanted, then a fairly simple parameterized answer is to add the row and column names when creating the matrix as in: # Create a matrix of size M by N rows, initialiazed to NA # and also add row names that look like row1, row2, ... rowM # as well as column names that look like col1, col2, ... colN # Set the parameters and the rest is a one-liner, wrapped a bit # for legibility: M <- 2 N <- 4 rowpref <- "row" colpref <- "col" myvalues <- matrix(data=NA, nrow=M, ncol=N, dimnames=list(rows=paste("row", seq(M), sep=""), cols=paste("col", seq(N), sep=""))) The resulting value is: > myvalues cols rows col1 col2 col3 col4 row1 NA NA NA NA row2 NA NA NA NA -Original Message- From: R-help On Behalf Of Sorkin, John Sent: Tuesday, July 4, 2023 12:17 AM To: Rolf Turner ; Bert Gunter Cc: r-help@r-project.org (r-help@r-project.org) ; Achim Zeileis Subject: Re: [R] Create a variable lenght string that can be used in a dimnames statement My life is complete. I have inspired a fortune! John From: Rolf Turner Sent: Monday, July 3, 2023 6:34 PM To: Bert Gunter Cc: Sorkin, John; r-help@r-project.org (r-help@r-project.org); Achim Zeileis Subject: Re: [R] Create a variable lenght string that can be used in a dimnames statement On Mon, 3 Jul 2023 13:40:41 -0700 Bert Gunter wrote: > I am not going to try to sort out your confusion, as others have > already tried and failed. Fortune nomination!!! cheers, Rolf Turner -- Honorary Research Fellow Department of Statistics University of Auckland Stats. Dep't. (secretaries) phone: +64-9-373-7599 ext. 89622 Home phone: +64-9-480-4619 __ R-help@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. __ R-help@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.
Re: [R] Create a variable lenght string that can be used in a dimnames statement
(Sorry for the double post.) On Tue, 4 Jul 2023 10:14:43 +0300 Ivan Krylov wrote: > Try replacing the _second_ paste() in the example above with a c(). What I had forgotten to mention is that you also need to replace the initial assignment > string="" with the following: string = character() (NULL and c(), as mentioned by Rui, are also valid options here.) If you don't do that, the empty string remains an element in the resulting vector c('', 'xxx1', 'xxx2'), which is not the desired result. It's awkward to build data structures in an iterative manner, which is why solutions like Rui's paste0("xxx", 1:2) are considered more idiomatic. -- Best regards, Ivan __ R-help@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.
Re: [R] Create a variable lenght string that can be used in a dimnames statement
On Mon, 3 Jul 2023 20:08:06 + "Sorkin, John" 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 > string You 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 __ R-help@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.