2014-02-09 3 views
7

Рассмотрим этот код:номер печати, как слово, если менее 10

sample(1:20, 1) 

Если результат случается быть меньше или равно 10, можно получить R напечатать число как слово. Например, если результат sample(1:20, 1) равен 2, я могу запрограммировать R, чтобы напечатать результат как два, если результат sample(1:20, 1) равен 10, я могу запрограммировать R, чтобы напечатать результат как десять, если результат sample(1:20, 1) равен 13, может Я программирую R, чтобы напечатать результат как 13, и так далее.

Я использую knitr для преобразования R-кода в латекс для моей диссертации. Мое правило - любое число, меньшее или равное 10, должно быть напечатано как слово.

+2

Ваш тезис содержит целые числа, то есть что вы хотите напечатать для '9.34'? – baptiste

ответ

12

Вы можете использовать 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" 
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 
6

Вот по существу такой же, как ответ Марка, но совсем немного более кратким:

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" 

Хотя, если вы используете knitr с LaTeX, это, возможно, задача f или 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}} 
Смежные вопросы