制表符分隔的文本文件,实际上是数据库表的导出(使用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
向量,具体取决于相关表模式中定义的数据类型。
答案 0 :(得分:4)
你会为varchar字段建议“character”或“factor”吗?
正如约翰所说,这取决于使用情况。在两者之间切换很简单,所以不要太担心它。如果列表示分类变量,则最终应将其视为factor
。如果您打算挖掘文本(例如评论字段),那么character
会更有意义。
可以在日期时间使用“character”吗?
将日期存储在数据框中是很好的,但是如果您希望将它们正确地用于分析目的,则必须将其转换为Date
或POSIXct/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设置为与默认设置相同。