如果小于10,则将数字打印为单词

时间:2014-02-09 10:51:58

标签: r latex knitr

考虑以下代码:

sample(1:20, 1)

如果结果恰好小于或等于10,我可以让R将数字打印成单词。例如,如果sample(1:20, 1)的结果是2,我可以编程R将结果打印为2,如果sample(1:20, 1)的结果是10,我可以编程R将结果打印为10,如果sample(1:20, 1)的结果是13,我可以编程R将结果打印为13,依此类推。

我正在使用knitr将R代码转换为我的论文的乳胶。我的规则是任何小于或等于10的数字都应该打印成单词。

3 个答案:

答案 0 :(得分:13)

您可以使用english包将数字转换为英语单词:

set.seed(1)
s <- sample(1:20, 10)
# [1]  6  8 11 16  4 14 15  9 19  1

library(english)
ifelse(s > 10, s, as.character(english(s)))
# [1] "six"   "eight" "11"    "16"    "four"  "14"    "15"    "nine"  "19"    "one"

答案 1 :(得分:7)

这与Mark的答案基本相同,但更简洁:

numbers = c('zero', 'one', 'two', 'three', 'four', 'five',
            'six', 'seven', 'eight', 'nine', 'ten')
readable = function (x) ifelse(x < 11, numbers[x + 1], x)
> readable(sample(1:20, 10))
 [1] "20"    "12"    "13"    "seven" "ten"   "11"    "17"    "eight" "16"    "18"

虽然如果你使用kniter和LaTeX,这可以说是 LaTeX 的任务,而不是R:R提供原始数据,LaTeX负责格式化。我可能只是告诉knitr发布包含在宏中的数字 - \readable{42} - 然后使用此宏进行转换(未经测试,并且需要包siunitx):

\newcommand*\readable[1]{%
  \ifcase#1 zero\or one\or two\or three\or four\or five\or
    six\or seven\or eight\or nine\or ten\else\num{#1}}

答案 2 :(得分:2)

这不优雅,但我认为它会做你想要的。

set.seed(1234)

x <- sample(1:20, 1)

my.data <- read.table(text='
  x    y
  0    zero
  1    one
  2    two
  3    three
  4    four
  5    five
  6    six
  7    seven
  8    eight
  9    nine
  10   ten
', header = TRUE)

if(x > 10) {y = x} else {y = my.data$y[x == my.data$x]}

data.frame(x, y)

  x     y
1 3 three

这是一种一次转换多个数字的方法:

set.seed(1234)

x <- sample(1:20, 10)
x <- as.data.frame(x)

my.data <- read.table(text='
  x    y
  0    zero
  1    one
  2    two
  3    three
  4    four
  5    five
  6    six
  7    seven
  8    eight
  9    nine
  10   ten
', header = TRUE, stringsAsFactors = FALSE)

y <- apply(x, 1, function(i) if(i > 10) {y = i} else {y = my.data$y[i == my.data$x]})

data.frame(x, y)

    x     y
1   3 three
2  12    12
3  11    11
4  18    18
5  14    14
6  10   ten
7   1   one
8   4  four
9   8 eight
10  6   six