我遇到数据转换问题。我从.csv文件获得这些数据,例如:
comisiones[2850,28:30]
Periodo.Pago Monto.Pago.Credito Disposicion.En.Efectivo
2850 Mensual 11,503.68 102,713.20
字段Monto.Pago.Credito
有一个因子数据类,我需要它是数字但是双精度类。我需要小数。
str(comisiones$Monto.Pago.Credito)
Factor w/ 3205 levels "1,000.00","1,000.01",..: 2476 2197 1373 1905 1348 3002 1252 95 2648 667 ...
所以我使用通用数据转换函数as.numeric()
:
comisiones$Monto.Pago.Credito <- as.numeric(comisiones$Monto.Pago.Credito)
然后观察结果发生了变化:
comisiones[2850,28:30]
Periodo.Pago Monto.Pago.Credito Disposicion.En.Efectivo
2850 Mensual 796 102,713.20
str(comisiones$Monto.Pago.Credito)
num [1:5021] 2476 2197 1373 1905 1348 ...
comisiones$Monto.Pago.Credito
的最大值应为11,504.68,但现在为3205。
我不知道R中是否有特定的数据类或小数类型,我已经找了它,但它不起作用。
答案 0 :(得分:3)
您需要首先清理列,例如删除逗号,将其转换为字符然后转换为数字:
allenh1@localhost ~/CS/tableau-api/tableau-qt
$ ls lib64/tableausdk
Java libboost_thread.so libicuuc.so.44
libQt5Core.so.5 libboost_thread.so.1.56.0 libicuuc.so.44.0
libQt5Core.so.5.4.1 libcurl.so libmetrics2.so
libQt5Network.so.5 libcurl.so.4 libtabcrypto.so
libQt5Network.so.5.4.1 libcurl.so.4.4.0 libtabcrypto.so.1.0.0
libTableauCommon.so libexpat.so libtabssl.so
libTableauExtract.so libexpat.so.1 libtabssl.so.1.0.0
libTableauServer.so libexpat.so.1.6.0 libtabsys.so
libboost_chrono.so libicudata.so.44 libtabz.so
libboost_chrono.so.1.56.0 libicudata.so.44.0 libtabz.so.1
libboost_date_time.so libicui18n.so.44 libtabz.so.1.2.8
libboost_date_time.so.1.56.0 libicui18n.so.44.0 libtbb.so.2
libboost_system.so libicuio.so.44 libtbbmalloc.so.2
libboost_system.so.1.56.0 libicuio.so.44.0
将因子变量直接转换为数字时会出现问题。
答案 1 :(得分:2)
您可以使用tidyr包中的extract_numeric
- 它将处理因子输入并删除逗号,美元符号等。
library(tidyr)
comisiones$Monto.Pago.Credito <- extract_numeric(comisiones$Monto.Pago.Credito)
如果结果数字很大,则无论您使用as.numeric
还是extract_numeric
(它本身都会调用as.numeric
),它们在您查看时可能无法打印小数位。但精度仍然存储。例如:
> x <- extract_numeric("1,200,000.3444")
> x
[1] 1200000
验证是否仍存储了精度:
> format(x, nsmall = 4)
[1] "1200000.3444"
> x > 1200000.3
[1] TRUE