data.table::fread中的dec参数是什么意思?

7

我正在使用data.table中的fread加载csv文件。然而,我的csv文件使用dec=","作为小数分隔符(1.23将变为1,23)。与read.csv不同,似乎dec不是允许的参数。

R) args(fread)
function (input = "test.csv", sep = "auto", sep2 = "auto", nrows = -1,
    header = "auto", na.strings = "NA", stringsAsFactors = FALSE,
    verbose = FALSE, autostart = 30)

你是否能想到一种解决方法(可能是设置一个R选项),使我能够使用 fread (它比其他方式更快,可以为我节省很多时间)?

附注:由于 colClasses 尚未实现,因此无法像这篇文章中所示那样使用 setAs


1
作为一个解决方法,你可以用一个快速文本编辑器进行替换。 - Roland
3
根据之前问题中的fread代码(链接在评论中),似乎它使用了strtod函数(参考链接:http://www.cplusplus.com/reference/cstdlib/strtod/),这意味着实现逗号分隔的小数可能有点棘手(因为`strtod`中的小数点是硬编码的)。根据@Roland的评论,如果您在使用具有`sed`的系统(Linux、MacOS或带有Cygwin的PC),则可以使用它来实时进行此转换:请参见https://dev59.com/bnA75IYBdhLWcg3wKluM - Ben Bolker
@Ben Bolker:谢谢,我在使用Windows,但是我正在使用实现了sed的gnuWin32,我会尝试您的建议并告知您进展情况! - statquant
1
@BenBolker:我学会了小心处理语言环境:http://stat.ethz.ch/pipermail/r-devel/2012-August/064609.html - cbeleites unhappy with SX
1
@Matthew:我会在R-forge上提出请求,谢谢。 - statquant
显示剩余5条评论
1个回答

8

2014年10月更新:现在是v1.9.5版

fread现在接受dec=','(以及其他非“.”的小数分隔符),#917。`?fread`新增了一段文字。如果您位于使用dec=','的国家,则应该可以正常工作。如果没有,则需要阅读该段落以执行额外的步骤。如果不幸破坏了dec='.',则可以使用options(datatable.fread.dec.experiment=FALSE)关闭此新功能。



之前的回答...

Matt Dowle通过区域设置找到了一个不错的解决方法。 首先看一下我的sessionInfo

sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: i386-w64-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=French_France.1252  LC_CTYPE=French_France.1252    LC_MONETARY=French_France.1252 LC_NUMERIC=C
[5] LC_TIME=C
...

尝试以下操作即可找到罪魁祸首:
Sys.localeconv()["decimal_point"]
decimal_point 
          "." 

尝试在Ubuntu(Matthew)和WinXP(me)上设置LC_NUMERIC是可行的。

Sys.setlocale("LC_NUMERIC", "French_France.1252")
[1] "French_France.1252"
Message d'avis :
In Sys.setlocale("LC_NUMERIC", "French_France.1252") :
  changer 'LC_NUMERIC' peut résulter en un fonctionnement étrange de R

这个行为表现良好,会随着以下变化而改变:

DT = fread("A,B\n3,14;123\n4,22;456\n",sep=";")
str(DT)
Classes ‘data.table’ and 'data.frame':  2 obs. of  2 variables:
 $ V1: num  3.14 4.22
 $ V2: int  123 456

"."十进制分隔符现在被加载为字符串(这是正确的方式),以前则相反。
DT = fread("A,B\n3.14;123\n4.22;456\n",sep=";")
str(DT)
Classes ‘data.table’ and 'data.frame':  2 obs. of  2 variables:
 $ V1: chr  "3.14" "4.22"
 $ V2: int  123 456

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接