xn <- as.numeric(sub("c",".7",sub("b",".5",sub("a",".3",xc)))) On Sat, Jul 11, 2020 at 5:09 AM Richard O'Keefe <raoknz at gmail.com> wrote:> This can be done very simply because vectors in R can have > named elements, and can be indexed by strings. > > > stage <- c("1" = 1, "1a" = 1.3, "1b" = 1.5, "1c" = 1.7, > + "2" = 2, "2a" = 2.3, "2b" = 2.5, "2c" = 2.7, > + "3" = 3, "3a" = 3.3, "3b" = 3.5, "3c" = 3.7) > > > testdata <- rep(c("1", "1a", "1b", "1c", > + "2", "2a", "2b", "2c", > + "3", "3a", "3b", "3c"), times=c(1:6,6:1)) > > > stage[testdata] > 1 1a 1a 1b 1b 1b 1c 1c 1c 1c 2 2 2 2 2 2a 2a 2a 2a > 2a > 1.0 1.3 1.3 1.5 1.5 1.5 1.7 1.7 1.7 1.7 2.0 2.0 2.0 2.0 2.0 2.3 2.3 2.3 2.3 > 2.3 > 2a 2b 2b 2b 2b 2b 2b 2c 2c 2c 2c 2c 3 3 3 3 3a 3a 3a > 3b > 2.3 2.5 2.5 2.5 2.5 2.5 2.5 2.7 2.7 2.7 2.7 2.7 3.0 3.0 3.0 3.0 3.3 3.3 3.3 > 3.5 > 3b 3c > 3.5 3.7 > > On Sat, 11 Jul 2020 at 05:51, Jean-Louis Abitbol <abitbol at sent.com> wrote: > > > Dear All > > > > I have a character vector, representing histology stages, such as for > > example: > > xc <- c("1", "1a", "1b", "1c", "2", "2a", "2b", "2c") > > > > and this goes on to 3, 3a etc in various order for each patient. I do > have > > of course a pre-established classification available which does change > > according to the histology criteria under assessment. > > > > I would want to convert xc, for plotting reasons, to a numeric vector > such > > as > > > > xn <- c(1, 1.3, 1.5, 1.7, 2, 2.3, 2.5, 2.7) > > > > Unfortunately I have no clue on how to do that. > > > > Thanks for any help and apologies if I am missing the obvious way to do > it. > > > > JL > > -- > > Verif30042020 > > > > ______________________________________________ > > 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]] > > ______________________________________________ > 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]]
The string index approach works with any mapping from stage names to stage numbers, not just regular ones. For example, if we had "1" -> 1, "1a" -> 1.4, "1b" -> 1.6 "2" -> 2, "2a" -> 2.3, "2b" -> 2.7 the 'sub' version would fail miserably while the string index version would just work. The 'sub' version would also not work terribly well if the mapping were "1" -> 1, "a1" -> 1.3, "b1" -> 1.5, "c1" -> 1.7 and so on. The thing I like about the indexing approach is that it uses a fundamental operation of the language very directly. Anyone using R would do well to *master* what indexing can do for you. On Sat, 11 Jul 2020 at 17:16, Eric Berger <ericjberger at gmail.com> wrote:> xn <- as.numeric(sub("c",".7",sub("b",".5",sub("a",".3",xc)))) > > > On Sat, Jul 11, 2020 at 5:09 AM Richard O'Keefe <raoknz at gmail.com> wrote: > >> This can be done very simply because vectors in R can have >> named elements, and can be indexed by strings. >> >> > stage <- c("1" = 1, "1a" = 1.3, "1b" = 1.5, "1c" = 1.7, >> + "2" = 2, "2a" = 2.3, "2b" = 2.5, "2c" = 2.7, >> + "3" = 3, "3a" = 3.3, "3b" = 3.5, "3c" = 3.7) >> >> > testdata <- rep(c("1", "1a", "1b", "1c", >> + "2", "2a", "2b", "2c", >> + "3", "3a", "3b", "3c"), times=c(1:6,6:1)) >> >> > stage[testdata] >> 1 1a 1a 1b 1b 1b 1c 1c 1c 1c 2 2 2 2 2 2a 2a 2a >> 2a >> 2a >> 1.0 1.3 1.3 1.5 1.5 1.5 1.7 1.7 1.7 1.7 2.0 2.0 2.0 2.0 2.0 2.3 2.3 2.3 >> 2.3 >> 2.3 >> 2a 2b 2b 2b 2b 2b 2b 2c 2c 2c 2c 2c 3 3 3 3 3a 3a >> 3a >> 3b >> 2.3 2.5 2.5 2.5 2.5 2.5 2.5 2.7 2.7 2.7 2.7 2.7 3.0 3.0 3.0 3.0 3.3 3.3 >> 3.3 >> 3.5 >> 3b 3c >> 3.5 3.7 >> >> On Sat, 11 Jul 2020 at 05:51, Jean-Louis Abitbol <abitbol at sent.com> >> wrote: >> >> > Dear All >> > >> > I have a character vector, representing histology stages, such as for >> > example: >> > xc <- c("1", "1a", "1b", "1c", "2", "2a", "2b", "2c") >> > >> > and this goes on to 3, 3a etc in various order for each patient. I do >> have >> > of course a pre-established classification available which does change >> > according to the histology criteria under assessment. >> > >> > I would want to convert xc, for plotting reasons, to a numeric vector >> such >> > as >> > >> > xn <- c(1, 1.3, 1.5, 1.7, 2, 2.3, 2.5, 2.7) >> > >> > Unfortunately I have no clue on how to do that. >> > >> > Thanks for any help and apologies if I am missing the obvious way to do >> it. >> > >> > JL >> > -- >> > Verif30042020 >> > >> > ______________________________________________ >> > 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]] >> >> ______________________________________________ >> 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]]
There are many ways to do what is requested and some are fairly simple and robust. A simple switch statement will do if you write some code but consider using a function from some package for simple vectors or factors. You could use the recode() or recode_factor() functions in package dplyr or other similar functions elsewhere and type in the conversions like so: library("dplyr") xc <- c("1", "1a", "1b", "1c", "2", "2a", "2b", "2c") xn <- c(1, 1.3, 1.5, 1.7, 2, 2.3, 2.5, 2.7) sample <- rep(xc, each=3) recode(sample, "1" = 1, "1a" = 1.3, "1b" = 1.5, "1c" = 1.7, "2" = 2, "2a" =2.3, "2b" = 2.5, "2c" = 2.7) That returns: [1] 1.0 1.0 1.0 1.3 1.3 1.3 1.5 1.5 1.5 1.7 1.7 1.7 2.0 2.0 2.0 2.3 2.3 2.3 2.5 2.5 2.5 2.7 2.7 2.7 To use the original vectors would be a tad harder but doable perhaps using some indirection. As has been noted, you need to be careful in matching things to use the entire item from beginning to end as matching a substring can produce odd results. If you add this code to the above, in a silly way, it works for a more general case: library(glue) converted <- sample for (i in 1:length(xc)) { converted <- sub(glue("^{xc[i]}$"), xn[i], converted) } result <- as.numeric(converted) Returns:> result[1] 1.0 1.0 1.0 1.3 1.3 1.3 1.5 1.5 1.5 1.7 1.7 1.7 2.0 2.0 2.0 2.3 2.3 2.3 2.5 2.5 2.5 2.7 2.7 2.7 Not necessarily efficient but it works. You could use something like glue::glue() to create the arguments you want to use for something like recode() in more complex cases and so on. I think we have had enough solutions and methods posted but there are likely many more as there is rarely only one way to do things in R. -----Original Message----- From: R-help <r-help-bounces at r-project.org> On Behalf Of Richard O'Keefe Sent: Saturday, July 11, 2020 3:02 AM To: Eric Berger <ericjberger at gmail.com> Cc: Jean-Louis Abitbol <abitbol at sent.com>; R Project Help <r-help at r-project.org> Subject: Re: [R] Character (1a, 1b) to numeric The string index approach works with any mapping from stage names to stage numbers, not just regular ones. For example, if we had "1" -> 1, "1a" -> 1.4, "1b" -> 1.6 "2" -> 2, "2a" -> 2.3, "2b" -> 2.7 the 'sub' version would fail miserably while the string index version would just work. The 'sub' version would also not work terribly well if the mapping were "1" -> 1, "a1" -> 1.3, "b1" -> 1.5, "c1" -> 1.7 and so on. The thing I like about the indexing approach is that it uses a fundamental operation of the language very directly. Anyone using R would do well to *master* what indexing can do for you. On Sat, 11 Jul 2020 at 17:16, Eric Berger <ericjberger at gmail.com> wrote:> xn <- as.numeric(sub("c",".7",sub("b",".5",sub("a",".3",xc)))) > > > On Sat, Jul 11, 2020 at 5:09 AM Richard O'Keefe <raoknz at gmail.com> wrote: > >> This can be done very simply because vectors in R can have named >> elements, and can be indexed by strings. >> >> > stage <- c("1" = 1, "1a" = 1.3, "1b" = 1.5, "1c" = 1.7, >> + "2" = 2, "2a" = 2.3, "2b" = 2.5, "2c" = 2.7, >> + "3" = 3, "3a" = 3.3, "3b" = 3.5, "3c" = 3.7) >> >> > testdata <- rep(c("1", "1a", "1b", "1c", >> + "2", "2a", "2b", "2c", >> + "3", "3a", "3b", "3c"), times=c(1:6,6:1)) >> >> > stage[testdata] >> 1 1a 1a 1b 1b 1b 1c 1c 1c 1c 2 2 2 2 2 2a 2a 2a >> 2a >> 2a >> 1.0 1.3 1.3 1.5 1.5 1.5 1.7 1.7 1.7 1.7 2.0 2.0 2.0 2.0 2.0 2.3 2.3 >> 2.3 >> 2.3 >> 2.3 >> 2a 2b 2b 2b 2b 2b 2b 2c 2c 2c 2c 2c 3 3 3 3 3a 3a >> 3a >> 3b >> 2.3 2.5 2.5 2.5 2.5 2.5 2.5 2.7 2.7 2.7 2.7 2.7 3.0 3.0 3.0 3.0 3.3 >> 3.3 >> 3.3 >> 3.5 >> 3b 3c >> 3.5 3.7 >> >> On Sat, 11 Jul 2020 at 05:51, Jean-Louis Abitbol <abitbol at sent.com> >> wrote: >> >> > Dear All >> > >> > I have a character vector, representing histology stages, such as >> > for >> > example: >> > xc <- c("1", "1a", "1b", "1c", "2", "2a", "2b", "2c") >> > >> > and this goes on to 3, 3a etc in various order for each patient. I >> > do >> have >> > of course a pre-established classification available which does >> > change according to the histology criteria under assessment. >> > >> > I would want to convert xc, for plotting reasons, to a numeric >> > vector >> such >> > as >> > >> > xn <- c(1, 1.3, 1.5, 1.7, 2, 2.3, 2.5, 2.7) >> > >> > Unfortunately I have no clue on how to do that. >> > >> > Thanks for any help and apologies if I am missing the obvious way >> > to do >> it. >> > >> > JL >> > -- >> > Verif30042020 >> > >> > ______________________________________________ >> > 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]] >> >> ______________________________________________ >> 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]] ______________________________________________ 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.