LINUX.ORG.RU

округление чисел при импорте из .csv

 , , ,


0

1

Снова я со своими проблемами.

Есть .csv файл:

;;G;59.942;;k;R;cp;$\xi$;1.06;1.05;1.03;1.01;1;0.95;0.9
p;344464;T;425.93;;1.4;287.037;1004.5;$H_{zi}$;48610;48151;47234;46317;45858;43565;41272
?;0.865;?;5.758;;;;;$\eta_i$;0.9;0.889;0.888;0.887;0.886;0.885;0.884
z;7;;;;;;;$T_{02i}$;474.3220683;522.2576077;569.2800891;615.3895127;661.0424073;704.4126572;745.5002624
Hz;321008;;;;;;;$\pi_i$;1.4060;1.3514;1.3089;1.2749;1.2496;1.2184;1.1924
Hzcp;45858;45858;45858;45858;45858;45858;45858;$T_{1i}$;425.93;474.3220683;522.2576077;569.2800891;615.3895127;661.0424073;704.4126572

Выглядит нечитабельно, но импортируется нормально следующей командой:

raspredel <- read.csv(file="raspredel.csv", sep=';', header=F, encoding = "cp1251", nrows = 6)[ ,9:16]
         V9        V10        V11        V12        V13        V14        V15        V16
1    $\\xi$     1.0600     1.0500     1.0300     1.0100     1.0000     0.9500     0.9000
2  $H_{zi}$ 48610.0000 48151.0000 47234.0000 46317.0000 45858.0000 43565.0000 41272.0000
3 $\\eta_i$     0.9000     0.8890     0.8880     0.8870     0.8860     0.8850     0.8840
4 $T_{02i}$   474.3221   522.2576   569.2801   615.3895   661.0424   704.4127   745.5003
5  $\\pi_i$     1.4060     1.3514     1.3089     1.2749     1.2496     1.2184     1.1924
6  $T_{1i}$   425.9300   474.3221   522.2576   569.2801   615.3895   661.0424   704.4127

Нужно округлить числа так, чтобы после целых чисел не добавлялось нулей.

Нагуглил вот такой вариант решения:

raspredel <- read.csv(file="raspredel.csv", sep=';', header=F, encoding = "cp1251", nrows = 6)[ ,10:16]
raspreel1 <- data.frame(
  formatC(as.numeric(raspredel), format="f", digits=2, drop0trailing = TRUE),
  c("1", "2", "3", "4", "5", "6")
)

В ответ получаю ошибку

Error in formatC(as.numeric(raspredel), format = «f», digits = 2, drop0trailing = TRUE) : 
  (list) object cannot be coerced to type 'double'

Пробую сделать так:

raspredel <- read.csv(file="raspredel.csv", sep=';', header=F, encoding = "cp1251", nrows = 6, strip.white = TRUE, stringsAsFactors = FALSE, dec = ".")[ ,10:16]
raspreel1 <- data.frame(
  formatC(as.numeric(raspredel), format="f", digits=2, drop0trailing = TRUE),
  c("1", "2", "3", "4", "5", "6")
)

Получаю ту же ошибку.

Подскажите, пожалуйста, ЧЯДНТ?

Ответ на: комментарий от ados

Я так понимаю, необходимости транспонировать нет, если я загружаю только числа. Я, собственно, это и делаю, когда использую formatC():

raspredel <- read.csv(file="raspredel.csv", sep=';', header=F, encoding = "cp1251", nrows = 6)[ ,10:16]
         V10        V11        V12        V13        V14        V15        V16
1     1.0600     1.0500     1.0300     1.0100     1.0000     0.9500     0.9000
2 48610.0000 48151.0000 47234.0000 46317.0000 45858.0000 43565.0000 41272.0000
3     0.9000     0.8890     0.8880     0.8870     0.8860     0.8850     0.8840
4   474.3221   522.2576   569.2801   615.3895   661.0424   704.4127   745.5003
5     1.4060     1.3514     1.3089     1.2749     1.2496     1.2184     1.1924
6   425.9300   474.3221   522.2576   569.2801   615.3895   661.0424   704.4127
frigate_freedom ★★ ()

Ну, твоя ошибка возникает уже на этапе as.numeric(raspredel).

Как вариант, выводить через sprintf("%s", raspredel), но там вид вывода несколько другой.

Не до конца понял изначальную задачу, ТС хочет округлить или просто вывести в округлённом виде?

Karthago ★★ ()
Последнее исправление: Karthago (всего исправлений: 1)

Прошу прощения за тупняк. Оказывается, надо было применять formatC к каждому столбцу (строке), о чём мне и говорили.

Решение выглядит так:

raspredel <- read.csv(file="raspredel.csv", sep=';', header=F, encoding = "cp1251", nrows = 6)[ ,9:16]
raspredel.v1 <- formatC(as.numeric(raspredel[1,2:8]), format="f", digits=2)
raspredel.v2 <- formatC(as.numeric(raspredel[2,2:8]), format="f", digits=0)
raspredel.v3 <- formatC(as.numeric(raspredel[3,2:8]), format="f", digits=2)
raspredel.v4 <- formatC(as.numeric(raspredel[4,2:8]), format="f", digits=2)
raspredel.v5 <- formatC(as.numeric(raspredel[5,2:8]), format="f", digits=2)
raspredel.v6 <- formatC(as.numeric(raspredel[6,2:8]), format="f", digits=2)

raspredel0 <- rbind(raspredel.v1,
                    raspredel.v2,
                    raspredel.v3,
                    raspredel.v4,
                    raspredel.v5,
                    raspredel.v6
)

raspredel1 <- data.frame(c("$\\xi$", "$H_{zi}$, $\\frac{\\text{кДж}}{\\text{кг}}$", "$\\eta_i$", "$T_{02i}$, К", "$\\pi_i$", "$T_{01i}$, К"),
                         raspredel0
)

kable(raspredel1, "latex", caption = "Распределение затраченной работы и КПД КВД по ступеням", escape = F, col.names = c("", "1", "2", "3", "4", "5", "6", "7"), align="c", row.names = F) %>%
kable_styling(latex_options = c("hold_position"))

Пришлось делать ручками, но ничего лучше не придумал, главное — работает.

frigate_freedom ★★ ()
Последнее исправление: frigate_freedom (всего исправлений: 1)