代码之家  ›  专栏  ›  技术社区  ›  afishlax

Vroom将R中的负会计值转换为正

  •  0
  • afishlax  · 技术社区  · 1 年前

    我正试图使用以下方法将多个包含会计数据的.csv数据集合并到一个大型数据集中 vroom 。各个文件的组成通常不同,因此我需要指定强制的列类型 NA 在适用的情况下,应为数字。但是,当我试图分配 col_types() ,我无法获得理想的输出。

    example.csv

    姓名 价值观
    A. (10,000.00)
    B -10,000.00
    B 10,000.00

    使用 col_number()

    vroom("example.csv", 
          delim = ",",
          col_types = cols(Name = col_character(),
                           Value = col_number()))
    

    结果

    # A tibble: 3 × 2
      Name   Value
      <chr>  <dbl>
    1 A      10000
    2 B     -10000
    3 C      10000
    

    所以, col_number() 括号未被评估为负值。

    使用 col_double()

    vroom("example.csv", 
          delim = ",",
          col_types = cols(Name = col_character(),
                           Value = col_double()))
    

    结果

    # A tibble: 3 × 2 
      Name   Value
      <chr>  <dbl>
    1 A      NA
    2 B      NA
    3 C      NA
    

    所以, col_double() 逗号(,)的大标记格式有问题。

    是否有解决此问题的选项? 数据从源代码的.xls文件开始,使用括号表示负数,甚至在保存到.csv文件后,它也会将视图更改为负号,并读取 vroom 似乎认为它们的格式仍然有括号。

    我之前的解决方案是在.csv文件中读取非常臃肿的内容 read_csv 然后进行手动操作 gsub 消除大标记和大标记造成的问题;圆括号。

    1 回复  |  直到 1 年前
        1
  •  3
  •   Axeman    1 年前

    我很好奇是否有更简单的方法,但一种方法是引入角色,转换 ( - ,然后转换为数字。

    df <- vroom::vroom(file = I("Name,Val\nA,(10)\nB,-10\nB,10"),
                 delim = ",",
                 col_types = cols(Name = col_character(),
                                  Val = col_character()))
    df 
    # A tibble: 3 × 2
      Name  Val  
      <chr> <chr>
    1 A     (10) 
    2 B     -10  
    3 B     10
    
    
    df$Val = readr::parse_number(gsub("\\(", "-", df$Val))
    df     
    

    结果

      Name    Val
      <chr> <dbl>
    1 A       -10
    2 B       -10
    3 B        10