将正确的(alpha)数字字段读入R中

时间:2010-04-29 07:44:28

标签: r

制表符分隔的文本文件,实际上是数据库表的导出(使用bcp),具有该格式(前5列):

102 1   01  e113c   3224.96     12  
102 1   01  e185    101127.25   12
102 2   01  e185    176417.90   12
102A   3    01  e185    26261.03    12

我尝试使用类似

的命令在R中导入它
data <- read.delim("C:\\test.txt", header = FALSE, sep = "\t")

问题是第3列实际上是varchar字段(字母数字)被错误地读为整数(因为整列中没有字母)并且前导零消失。使用odbcConnect直接从数据库导入数据时发生了同样的事情。该列再次被读为整数。

str(data)
$ code: int  1 1 1 1 1 1 6 1 1 8 ...

如何在R中正确导入这样的数据集,以便在进行一些数据操作后能够安全地再次填充该数据库表?

修改

我在read.delim中添加了以下参数

 colClasses = c("factor","integer","factor","factor","numeric","character","factor","factor","factor","factor","integer","character","factor")
  • 您会为varchar字段建议“字符”或“因素”吗?

  • 是否可以在日期时间使用“character”?

  • 我该怎么办才能读取像540912.68999999994这样的数字字段,而不是540912.69?

我希望尽可能自动创建colClasses向量,具体取决于相关表模式中定义的数据类型。

2 个答案:

答案 0 :(得分:4)

  

你会为varchar字段建议“character”或“factor”吗?

正如约翰所说,这取决于使用情况。在两者之间切换很简单,所以不要太担心它。如果列表示分类变量,则最终应将其视为factor。如果您打算挖掘文本(例如评论字段),那么character会更有意义。

  

可以在日期时间使用“character”吗?

将日期存储在数据框中是很好的,但是如果您希望将它们正确地用于分析目的,则必须将其转换为DatePOSIXct/POSIXlt格式。

  

为了能够完全按原样读取540912.68999999994这样的数字字段而不是540912.69,我该怎么办?

读入的值通常为双精度(约15 sig figs);在这个特定的例子中,540912.69是您可以达到的最佳精度。比较

print(540912.68999999994)             # 540912.7
print(540912.68999999994, digits=22)  # 540912.69
print(540912.6899999994)              # 540912.7
print(540912.6899999994, digits=22)   # 540912.6899999994

编辑:如果您需要更精确的数字,请使用Rmpfr包。


  

我希望尽可能自动创建colClasses向量,具体取决于相关表格模式中定义的数据类型。

colClasses的默认值(当你没有指定它时)可以很好地猜测列应该是什么。如果您正在使用01作为字符,那么就无法明确指定它。

答案 1 :(得分:1)

角色和因素问题只有你能回答的问题。这取决于您以后需要将它们用作因子或字符。这取决于你之后是否需要清理它们。例如,如果您计划在之后对一个因子应用一些ifelse()修改,那么您现在也可以将其作为一个字符读取,然后将其转换为一个因子。或者,如果你想以某种方式专门编码这个因素,你可能最好以字符形式阅读它。

顺便说一句,你在read.table上使用read.delim的原因是因为默认设置,所以不要把sep设置为与默认设置相同。