【问题标题】:Read file with decimals as comma not working in R cordinates?用小数点作为逗号读取文件在 R 坐标中不起作用?
【发布时间】:2022-01-26 09:41:39
【问题描述】:

我收到了一个带有 XY 坐标的字段,其中有一个小数点作为逗号,但我无法在 R 中正确打开此文件。

以下是我的数据的外观 - 请注意逗号作为 y 坐标中的小数指示符:

"OBJECTID";"x_coord";"y_coord"
"1";"664936,3059";"5582773,2319"   # comma as separator
"2";"604996,5803";"5471445,4964"
"3";"772846,82";"5353980,45"
"4";"552181,8639";"5535271,7626"
"5";"604022,9011";"5470134,0649"

但是,在read.csv 中指定dec = ',' 只会将其读取为正常值:

xy <- read.delim(paste(path, "test_decimals2.txt", sep = '/'), 
               sep = '\t', dec = ",",skip = 0)

y 坐标中缺少逗号分隔符:

  OBJECTID    x_coord     y_coord
1        1 6649363059 55827732319   # not a comma separator anymore
2        2 6049965803 54714454964
3        3   77284682   535398045
4        4 5521818639 55352717626
5        5 6040229011 54701340649

我尝试将数据转换为txt等,但仍然有同样的问题。有人知道如何确保dec = ',' 能正常工作吗?谢谢!

(坐标在 UTM 中,这就是为什么它们看起来有点奇怪)

【问题讨论】:

  • 在我的环境中,read.delim(PATH, sep = ';', dec = ",", skip = 0) 不起作用。 (我认为这个问题是可以重现的)。

标签: r csv separator txt


【解决方案1】:

我将数据复制到一个 txt 文件中,这对我来说效果很好:

read.csv2("test_decimals2.txt")

输出:

  OBJECTID  x_coord y_coord
1        1 664936.3 5582773
2        2 604996.6 5471445
3        3 772846.8 5353980
4        4 552181.9 5535272
5        5 604022.9 5470134

【讨论】:

  • 确实,这对我有用:只需将其保存为另一种格式,然后删除第一行的“sep”指示符以正确读取其余部分。谢谢!
【解决方案2】:
a <- read.csv2("test_decimals2.txt", dec = ",", as.is = TRUE, header = FALSE, skip = 1)
a |> mutate(X = sub(",", ".", V2), Y = sub(",", ".", V3)) |>
  select(V1, X, Y)

【讨论】:

    【解决方案3】:

    我认为read.csv2 是那些欧洲风格的 csv-Data 的答案:

    xy <- read.csv2(file = paste(path, "test_decimals2.txt", sep = '/'))
    

    您的方法也可能是正确的。数据是正确的,只是在打印中没有显示足够的数字。

    尝试使用以下方式打印您的数据:

    > print.data.frame(xy, digits = 10)
      OBJECTID     x_coord     y_coord
    1        1 664936.3059 5582773.232
    2        2 604996.5803 5471445.496
    3        3 772846.8200 5353980.450
    4        4 552181.8639 5535271.763
    5        5 604022.9011 5470134.065
    
    

    这会打印限制为十位数的数据帧。

    【讨论】:

      【解决方案4】:

      添加到以前的答案。如果你想使用read.delim() 函数,你可以简单地输入:

      xy <- read.delim(file_path, sep = ';', skip = 0, dec = ",")
      

      xy <- read.delim(file_path, sep = ';', skip = 0, colClasses = "character")
      xy$x_coord <- as.numeric(gsub(",", ".", xy$x_coord))
      xy$y_coord <- as.numeric(gsub(",", ".", xy$y_coord))
      

      然后,您可以使用以下方法更改默认显示用途以打印更多数字:

      options(digits = 12)
      

      然后,打印 data.frame 会导致:

        OBJECTID     x_coord      y_coord
      1        1 664936.3059 5582773.2319
      2        2 604996.5803 5471445.4964
      3        3 772846.8200 5353980.4500
      4        4 552181.8639 5535271.7626
      5        5 604022.9011 5470134.0649
      

      【讨论】:

        【解决方案5】:

        一种可能的方法:

        testcommas <- read_delim(path,"\t", col_types=cols(.default="c"))
        testcommas
        # A tibble: 4 x 3
          item  coord_y coord_x
          <chr> <chr>   <chr>  
        1 1     156,158 543,697
        2 2     324,678 169,385
        3 3     097,325 325,734
        4 4     400,211 158,687
        

        这样,所有列都将是“字符”类型。然后,您可以根据需要将它们更改为数字。一种方式:

        testcommas <- data.frame(sapply(testcommas, function(x)  as.numeric(sub(",", ".", x, fixed = TRUE))))
        testcommas
          item coord_y coord_x
        1    1 156.158 543.697
        2    2 324.678 169.385
        3    3  97.325 325.734
        4    4 400.211 158.687
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-01
          • 2016-04-22
          • 1970-01-01
          • 1970-01-01
          • 2012-01-02
          • 1970-01-01
          • 2020-08-10
          相关资源
          最近更新 更多