Hi R people, I met a naive prolem. Could anyone give me a hint how to create such a vector with entries: "one", "two", "three", ...? I must have seen this problem somewhere else but I can't find that source now. Sorry to bother you with such a simple problem. Many thanks, Frank
How to create a vector with "one", "two", "three", ...?
6 messages · Federico Calboli, Frank Duan, Marc Schwartz +1 more
On Fri, 2005-04-15 at 14:30 -0400, Frank Duan wrote:
Hi R people, I met a naive prolem. Could anyone give me a hint how to create such a vector with entries: "one", "two", "three", ...?
rvect <- c("one", "two", "three")
rvect
[1] "one" "two" "three"
Is it what you want?
F
Federico C. F. Calboli Department of Epidemiology and Public Health Imperial College, St Mary's Campus Norfolk Place, London W2 1PG Tel +44 (0)20 7594 1602 Fax (+44) 020 7594 3193 f.calboli [.a.t] imperial.ac.uk f.calboli [.a.t] gmail.com
1 day later
Sorry, I didn't get the question clear. What I meant is to create a character vector with length 200: "one", "two", "three", ..., "two hundred"
On 4/15/05, Federico Calboli <f.calboli at imperial.ac.uk> wrote:
On Fri, 2005-04-15 at 14:30 -0400, Frank Duan wrote:
Hi R people, I met a naive prolem. Could anyone give me a hint how to create such a vector with entries: "one", "two", "three", ...?
rvect <- c("one", "two", "three")
rvect
[1] "one" "two" "three"
Is it what you want?
F
--
Federico C. F. Calboli
Department of Epidemiology and Public Health
Imperial College, St Mary's Campus
Norfolk Place, London W2 1PG
Tel +44 (0)20 7594 1602 Fax (+44) 020 7594 3193
f.calboli [.a.t] imperial.ac.uk
f.calboli [.a.t] gmail.com
I may be wrong, but I am unaware of anyone that has created a number to text function in R. If you search Google: http://www.google.com/search?q=numbers+into+words There are various program examples, from VB to JavaScript to PHP, etc. It shouldn't be too hard to convert one of them to R. Most have fairly common constructs in terms of parsing and converting the numbers. Some of them handle decimals and currency formats as well. HTH, Marc Schwartz
On Sat, 2005-04-16 at 18:01 -0400, Frank Duan wrote:
Sorry, I didn't get the question clear. What I meant is to create a character vector with length 200: "one", "two", "three", ..., "two hundred" On 4/15/05, Federico Calboli <f.calboli at imperial.ac.uk> wrote:
On Fri, 2005-04-15 at 14:30 -0400, Frank Duan wrote:
Hi R people, I met a naive prolem. Could anyone give me a hint how to create such a vector with entries: "one", "two", "three", ...?
rvect <- c("one", "two", "three")
rvect
[1] "one" "two" "three"
Is it what you want?
F
Dear Frank,
This was an interesting exercise. Here's a solution:
numbers2words <- function(x){
helper <- function(x){
digits <- rev(strsplit(as.character(x), "")[[1]])
nDigits <- length(digits)
if (nDigits == 1) as.vector(ones[digits])
else if (nDigits == 2)
if (x <= 19) as.vector(teens[digits[1]])
else trim(paste(tens[digits[2]],
Recall(as.numeric(digits[1]))))
else if (nDigits == 3) trim(paste(ones[digits[3]], "hundred",
Recall(makeNumber(digits[2:1]))))
else {
nSuffix <- ((nDigits + 2) %/% 3) - 1
if (nSuffix > length(suffixes)) stop(paste(x, "is too large!"))
trim(paste(Recall(makeNumber(digits[
nDigits:(3*nSuffix + 1)])),
suffixes[nSuffix],
Recall(makeNumber(digits[(3*nSuffix):1]))))
}
}
trim <- function(text){
gsub("^\ ", "", gsub("\ *$", "", text))
}
makeNumber <- function(...) as.numeric(paste(..., collapse=""))
opts <- options(scipen=100)
on.exit(options(opts))
ones <- c("", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine")
names(ones) <- 0:9
teens <- c("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
"sixteen", " seventeen", "eighteen", "nineteen")
names(teens) <- 0:9
tens <- c("twenty", "thirty", "forty", "fifty", "sixty", "seventy",
"eighty",
"ninety")
names(tens) <- 2:9
x <- round(x)
suffixes <- c("thousand", "million", "billion", "trillion")
if (length(x) > 1) return(sapply(x, helper))
helper(x)
}
For example:
numbers2words(56734200004350)
[1] "fifty six trillion seven hundred thirty four billion two hundred million four thousand three hundred fifty"
numbers2words(c(5673420000, 604))
[1] "five billion six hundred seventy three million four hundred twenty thousand" [2] "six hundred four"
numbers2words(21:30)
[1] "twenty one" "twenty two" "twenty three" "twenty four" "twenty five" [6] "twenty six" "twenty seven" "twenty eight" "twenty nine" "thirty"
Note that if you want, you could go beyond trillions by adding to suffixes. I hope that this does what you want, John -------------------------------- John Fox Department of Sociology McMaster University Hamilton, Ontario Canada L8S 4M4 905-525-9140x23604 http://socserv.mcmaster.ca/jfox --------------------------------
-----Original Message----- From: r-help-bounces at stat.math.ethz.ch [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Frank Duan Sent: Saturday, April 16, 2005 5:02 PM To: f.calboli at imperial.ac.uk Cc: r-help Subject: Re: [R] How to create a vector with "one", "two", "three", ...? Sorry, I didn't get the question clear. What I meant is to create a character vector with length 200: "one", "two", "three", ..., "two hundred" On 4/15/05, Federico Calboli <f.calboli at imperial.ac.uk> wrote:
On Fri, 2005-04-15 at 14:30 -0400, Frank Duan wrote:
Hi R people, I met a naive prolem. Could anyone give me a hint how to
create such
a vector with entries: "one", "two", "three", ...?
rvect <- c("one", "two", "three")
rvect
[1] "one" "two" "three"
Is it what you want?
F
--
Federico C. F. Calboli
Department of Epidemiology and Public Health Imperial College, St
Mary's Campus Norfolk Place, London W2 1PG
Tel +44 (0)20 7594 1602 Fax (+44) 020 7594 3193
f.calboli [.a.t] imperial.ac.uk
f.calboli [.a.t] gmail.com
______________________________________________ R-help at stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
Dear John, That's exactly what I want. Millions of thanks, Frank
On 4/16/05, John Fox <jfox at mcmaster.ca> wrote:
Dear Frank,
This was an interesting exercise. Here's a solution:
numbers2words <- function(x){
helper <- function(x){
digits <- rev(strsplit(as.character(x), "")[[1]])
nDigits <- length(digits)
if (nDigits == 1) as.vector(ones[digits])
else if (nDigits == 2)
if (x <= 19) as.vector(teens[digits[1]])
else trim(paste(tens[digits[2]],
Recall(as.numeric(digits[1]))))
else if (nDigits == 3) trim(paste(ones[digits[3]], "hundred",
Recall(makeNumber(digits[2:1]))))
else {
nSuffix <- ((nDigits + 2) %/% 3) - 1
if (nSuffix > length(suffixes)) stop(paste(x, "is too large!"))
trim(paste(Recall(makeNumber(digits[
nDigits:(3*nSuffix + 1)])),
suffixes[nSuffix],
Recall(makeNumber(digits[(3*nSuffix):1]))))
}
}
trim <- function(text){
gsub("^\ ", "", gsub("\ *$", "", text))
}
makeNumber <- function(...) as.numeric(paste(..., collapse=""))
opts <- options(scipen=100)
on.exit(options(opts))
ones <- c("", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine")
names(ones) <- 0:9
teens <- c("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
"sixteen", " seventeen", "eighteen", "nineteen")
names(teens) <- 0:9
tens <- c("twenty", "thirty", "forty", "fifty", "sixty", "seventy",
"eighty",
"ninety")
names(tens) <- 2:9
x <- round(x)
suffixes <- c("thousand", "million", "billion", "trillion")
if (length(x) > 1) return(sapply(x, helper))
helper(x)
}
For example:
numbers2words(56734200004350)
[1] "fifty six trillion seven hundred thirty four billion two hundred million four thousand three hundred fifty"
numbers2words(c(5673420000, 604))
[1] "five billion six hundred seventy three million four hundred twenty thousand" [2] "six hundred four"
numbers2words(21:30)
[1] "twenty one" "twenty two" "twenty three" "twenty four" "twenty five" [6] "twenty six" "twenty seven" "twenty eight" "twenty nine" "thirty"
Note that if you want, you could go beyond trillions by adding to suffixes. I hope that this does what you want, John -------------------------------- John Fox Department of Sociology McMaster University Hamilton, Ontario Canada L8S 4M4 905-525-9140x23604 http://socserv.mcmaster.ca/jfox --------------------------------
-----Original Message----- From: r-help-bounces at stat.math.ethz.ch [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Frank Duan Sent: Saturday, April 16, 2005 5:02 PM To: f.calboli at imperial.ac.uk Cc: r-help Subject: Re: [R] How to create a vector with "one", "two", "three", ...? Sorry, I didn't get the question clear. What I meant is to create a character vector with length 200: "one", "two", "three", ..., "two hundred" On 4/15/05, Federico Calboli <f.calboli at imperial.ac.uk> wrote:
On Fri, 2005-04-15 at 14:30 -0400, Frank Duan wrote:
Hi R people, I met a naive prolem. Could anyone give me a hint how to
create such
a vector with entries: "one", "two", "three", ...?
rvect <- c("one", "two", "three")
rvect
[1] "one" "two" "three"
Is it what you want?
F
--
Federico C. F. Calboli
Department of Epidemiology and Public Health Imperial College, St
Mary's Campus Norfolk Place, London W2 1PG
Tel +44 (0)20 7594 1602 Fax (+44) 020 7594 3193
f.calboli [.a.t] imperial.ac.uk
f.calboli [.a.t] gmail.com
______________________________________________ R-help at stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html