【问题标题】:Replacing dots, commas and percentages marks with load `csv` file with `fread()`用 `fread()` 加载 `csv` 文件替换点、逗号和百分比标记
【发布时间】:2022-08-12 16:08:58
【问题描述】:

当我们使用fread()R code used 部分中详述的参数(指定分隔符和十进制参数)时,我们希望管理来自csv 文件的列和最初的三个character 列类。 R 会话版本是 4.2.0data.table 版本是 1.14.2

输入来自csv 文件的数据


col_1,col_2, col_3
/100.432,\"30,84 %\",\"4,14\"
/3.200,\"62,89 %\",\"1,89\"
/10.100,\"50,00 %\",\"1,62\"
/15.570, \"40,10 %\",\"3,41\"
/900.310, \"8,00 %\",\"0,10\"

输入R 会话中的数据

> dat
# A tibble: 5 × 3
 
  col_1   col_2    col_3
  <chr>  <chr>   <chr>
1 100.432 30,84 % 4,14 
2   3.200 62,89 % 1,89 
3  10.100 50,00 % 1,62 
4  15.570 40,10 % 3,41 
5 900.310  8,00 % 0,10

使用的 R 代码


data.table::fread(
  x,
  sep = \',\',
  dec = \'.\',
  na.strings = c(\'\', \'NA\')) %>%
as_tibble()

期望的输出数据


> dat
# A tibble: 5 × 3
 
 col_1   col_2  col_3
  <dbl>  <dbl>  <dbl>
1 100438 30.84  4.14 
2   3200 62.89  1.89 
3  10100 50.00  1.62 
4  15570 40.10  3.41 
5 900310  8.00  0.10

问题

我们想获得Desired output data 格式。

提前致谢

  • 我很困惑:所谓的“输入数据”看起来像当前的输出。我期望的输入数据是 CSV 文件的相应样本。
  • 感谢@Aurèle 改进帖子的结构

标签: r data.table gsub fread


【解决方案1】:

你可以在 R 中做一些后处理:

RAW = fread('col_1,col_2, col_3
/100.432,"30,84Â %","4,14"
/3.200,"62,89Â %","1,89"
/10.100,"50,00Â %","1,62"
/15.570, "40,10Â %","3,41"
/900.310, "8,00Â %","0,10"')

#       col_1    col_2  col_3
#      <char>   <char> <char>
# 1: /100.432 30,84Â %   4,14
# 2:   /3.200 62,89Â %   1,89
# 3:  /10.100 50,00Â %   1,62
# 4:  /15.570 40,10Â %   3,41
# 5: /900.310  8,00Â %   0,10

library(readr)
RAW[, lapply(.SD, \(x) parse_number(x, locale = locale(decimal_mark = ",")))]
# Or in base R:
RAW[, lapply(.SD, \(x) gsub("[^0-9.]", "", chartr(".,", "_.", x)) |> as.numeric())]

#     col_1 col_2 col_3
#     <num> <num> <num>
# 1: 100432 30.84  4.14
# 2:   3200 62.89  1.89
# 3:  10100 50.00  1.62
# 4:  15570 40.10  3.41
# 5: 900310  8.00  0.10

【讨论】:

  • 这两个选项都可以正常工作。非常感谢@sindri_baldur
【解决方案2】:

我改进了@sindri_baldur 提出的后处理。在dplyr 版本1.0.9 中,代码应为:

输入来自csv 文件的数据


dat = data.table::fread(
 'col_1,col_2, col_3
 /100.432,"30,84Â %","4,14"
 /3.200,"62,89Â %","1,89"
 /10.100,"50,00Â %","1,62"
 /15.570, "40,10Â %","3,41"
 /900.310, "8,00Â %","0,10"')

输入R 会话中的数据

> dat
# A tibble: 5 × 3
 
  col_1   col_2    col_3
  <chr>  <chr>   <chr>
1 100.432 30,84 % 4,14 
2   3.200 62,89 % 1,89 
3  10.100 50,00 % 1,62 
4  15.570 40,10 % 3,41 
5 900.310  8,00 % 0,10

使用的 R 代码


> dat <- dat %>%
    as_tibble() %>%
    mutate_at(
      vars(everything()),
      ~ gsub('[^0-9.]', '', chartr('.,', '_.', .))) %>%
    mutate_at(
      vars(everything()),
      ~ as.numeric(as.character(.)))

最后输出数据


> dat
# A tibble: 5 × 3

   col_1 col_2 col_3
   <dbl> <dbl> <dbl>
1 100432  30.8  4.14
2   3200  62.9  1.89
3  10100  50    1.62
4  15570  40.1  3.41
5 900310   8    0.1

感谢大家提供解决方案并改进代码。

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 2011-10-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多