2017-01-21 8 views
0

У меня есть вектор, состоящий из смешанных значений двойной точности и очень коротких строк символов. Я хочу, чтобы sprintf их, показывая результаты до n цифр. Проблема в том, что я не могу использовать строки sprintf, используя, например, sprintf("%.8g", x), поэтому вместо этого я использую "%.8s".Как спрятать вектор смешанных типов и строк с точностью до n цифр?

Из-за этого, если R пишет число в научной нотации, я печатаю только начало номера, и результаты не имеют смысла. Простой пример такого поведения ниже:

koza <- c(pi, " > ", 2.01645169344289e-05) 
sprintf("%.8s", koza) 

Что я получаю это:

[1] "3.141592" " > "  "2.016451" 

То, что я хочу получить либо что-то вроде:

[1] "3.1415927" " > "  "0.0000202" 

или

[1] "3.1415927" " > "  "2.0164517e-05" 

Как я могу это сделать?

+1

Первое, что нужно сделать, чтобы сначала преобразовать в числовое. если это не na, то используйте функцию sprintf. 'unlist (lapply (koza, function (x) {ifelse (! is.na (as.numeric (x)), sprintf ("%. 8f ", as.numeric (x)), x)}))' – DJJ

+0

@DJJ Спасибо! Отлично подходит для форматирования в том, что я делаю. Я определил это как пользовательскую функцию и использовал ее вместо sprintf(). – Kusavil

ответ

1

Поскольку вы смешали числа и строки в этом векторе:

koza <- c(pi, " > ", 2.01645169344289e-05) 

R преобразовал их все символьные строки:

> koza 
[1] "3.14159265358979"  " > "     "2.01645169344289e-05" 

Так печать с "%s" форматировщиком будет форматировать его в виде строки , и поэтому вы получите только первые N символов "2.01645169344289e-05".

> sprintf("%.4s", "abcdefghij") 
[1] "abcd" 
> sprintf("%.4s", koza) 
[1] "3.14" " > " "2.01" 

Вы должны держать их как числовой как можно больше, форматировать их в виде десятичных чисел, а затем вставить их в строки.

+0

Спасибо за ваш ответ! Я знал, почему это происходит, я теряю цифры и точно так же, как вы говорите, мне, вероятно, нужно как-то отформатировать их, но я не знал, как это сделать. Я действительно не знал о unlist(), lapply() и как их использовать, но похоже, что решение, предоставляемое @DJJ, отлично подходит для меня :-) Я определил это как пользовательскую функцию и использовал ее вместо sprintf() , – Kusavil

 Смежные вопросы

  • Нет связанных вопросов^_^