读取带小数的分隔文本时出错

时间:2014-09-04 16:45:12

标签: r

我已将数据存储在文本文件中。 我使用Windows 7进行IT设置和"。"作为小数分隔符,";"列表分隔符。

列名称为:label,x,y和f。

  • 标签不包含任何数据。
  • x和y是坐标(带小数)
  • f是地面高程

文本文件标题:

 label      x           y           f
            2538359.78  4111150.05  1.73
            2538379.35  4111150.05  1.73
            2538398.91  4111150.05  1.72
            2538418.48  4111150.05  1.70

我用R导入数据:

 f <- read.delim("corners.txt", sep="\t", header = TRUE, dec=".", stringsAsFactors=TRUE)

我测试数据结构:

 str(f)

R输出为:

  'data.frame': 15390 obs. of  4 variables:
   $ label: logi  NA NA NA NA NA NA ...
   $ x    : num  2538360 2538379 2538399 2538418 2538438 ...
   $ y    : num  4111150 4111150 4111150 4111150 4111150 ...
   $ f    : num  1.73 1.73 1.72 1.7 1.68 1.66 1.63 1.6 1.57 1.53 ...

为什么x和y值都会错过小数部分? 如何以正确的方式加载数据?

我尝试使用Rstudio中的Import Dataset函数读取数据。 在主窗口中,我选择&#34;,&#34;作为小数点分隔符(??),在预览窗口中,所有内容都符合预期。

命令是:

 g <- read.delim("corners.txt", dec=",")

我测试数据结构:

str(g)

我明白了:

  'data.frame': 15390 obs. of  4 variables:
   $ label: logi  NA NA NA NA NA NA ...
   $ x    : Factor w/ 90 levels "2538359.78","2538379.35",..: 1 2 3 4 5 6 7 8 9 10 ...
   $ y    : Factor w/ 171 levels "4109169.94","4109189.81",..: 171 171 171 171 171 171 171 171 171 171 ...
   $ f    : Factor w/ 396 levels "0.11","0.13",..: 161 161 160 158 156 154 151 148 145 141 ...

数据保留x和y列的小数,但导入进程无法读取f列。

如何使用因子数转换来保留小数?这是对的吗?

 h$x <- as.numeric(as.character(g$x))

结果再次是已处理的x列缺少小数:

 'data.frame':  15390 obs. of  4 variables:
  $ label: logi  NA NA NA NA NA NA ...
  $ x    : num  2538360 2538379 2538399 2538418 2538438 ...
  $ y    : Factor w/ 171 levels "4109169.94","4109189.81",..: 171 171 171 171 171 171 171 171 171 171 ...
  $ f    : Factor w/ 396 levels "0.11","0.13",..: 161 161 160 158 156 154 151 148 145 141 ...

我也期待:

 getOptions(digits)

并将其设置为8(而不是默认值7)。

谢谢。

1 个答案:

答案 0 :(得分:3)

您在控制台中看到的并不总是100%代表真实值。当打印到控制台时,值被格式化为看起来很漂亮&#34;。这与options(digits=)有关。将其设置为8将不会有助于您的值,因为您有超过8位数。试试10个或更多。或者不要担心它。您的数据已正确导入。

看看

f <- read.delim("corners.txt", sep="\t", header = TRUE, dec=".", stringsAsFactors=TRUE)
dput(head(f$x))
# c(2538359.78, 2538379.35, 2538398.91, 2538418.48)

dput()将转储&#34; raw&#34;,不准确的数据。你可以看到你的小数值。或尝试

options(digits=10)
head(f$x)
# [1] 2538359.78 2538379.35 2538398.91 2538418.48

请注意str()还有自己的数字选项

str(f, digits=10)

# 'data.frame':   4 obs. of  4 variables:
#  $ label: logi  NA NA NA NA
#  $ x    : num  2538359.78 2538379.35 2538398.91 2538418.48
#  $ y    : num  4111150.05 4111150.05 4111150.05 4111150.05
#  $ f    : num  1.73 1.73 1.72 1.7