【问题标题】:Read csv file in R with currency column as numeric读取 R 中的 csv 文件,货币列为数字
【发布时间】:2011-11-12 08:41:50
【问题描述】:

我正在尝试将包含政治捐款信息的 csv 文件读入 R。据我了解,默认情况下将列作为因子导入,但我需要将数量列(数据集中的“CTRIB_AMT”)作为数字列导入,以便我可以运行各种不起作用的函数因素。该列被格式化为以“$”为前缀的货币。

我最初使用一个简单的读取命令来导入文件:

contribs <- read.csv('path/to/file')

然后尝试将 CTRIB_AMT 从货币转换为数字:

as.numeric(as.character(sub("$","",contribs$CTRIB_AMT, fixed=TRUE)))

但这没有用。我尝试用于 CTRIB_AMT 列的函数是:

vals<-sort(unique(dfr$CTRIB_AMT))
sums<-tapply( dfr$CTRIB_AMT, dfr$CTRIB_AMT, sum)
counts<-tapply( dfr$CTRIB_AMT, dfr$CTRIB_AMT, length)

查看相关问题here

对于如何最初导入文件以使列是数字或导入后如何转换有什么想法?

【问题讨论】:

  • 文件内容的一个小例子会很有帮助。
  • sub -> as.character -> as.numeric 转换应该可以解决问题。 “没用”是什么意思?
  • 为我工作。 CTRIB_AMT &lt;- factor(c("$5000","$2500","$100")); as.numeric(as.character(sub("$","",CTRIB_AMT, fixed=TRUE)))

标签: r currency symbols read.csv


【解决方案1】:

我不知道如何直接读入,但你可以修改它:

> A <- read.csv("~/Desktop/data.csv")
> A
  id   desc price
1  0  apple $1.00
2  1 banana $2.25
3  2 grapes $1.97
> A$price <- as.numeric(sub("\\$","", A$price))
> A
  id   desc price
1  0  apple  1.00
2  1 banana  2.25
3  2 grapes  1.97
> str(A)
'data.frame':   3 obs. of  3 variables:
 $ id   : int  0 1 2
 $ desc : Factor w/ 3 levels "apple","banana",..: 1 2 3
 $ price: num  1 2.25 1.97

我认为这可能只是你的潜艇失踪了。 $ 表示正则表达式中的行尾。 \$ 是美元符号。但是接下来你就得逃跑了……

【讨论】:

  • 我一开始还以为也有逃跑的地方,但fixed=TRUE 解决了这个问题...
  • +1 我还找到了gsub( "[$,]", "",。 . .对于像"$1,234" 这样的数字很有用。
  • 这不应该是公认的解决方案;它不如其他在读取时进行替换的解决方案,在读取时,返回数字,从而避免创建许多不必要的和唯一的字符串,这可能会在大文件上浪费 Mb/Gb,而且速度也较慢。
【解决方案2】:

另一种方法是使用 setAs 设置转换。
它被用于两个(相似的)问题:

满足您的需求:

setClass("Currency")
setAs("character", "Currency",
    function(from) as.numeric(sub("$","",from, fixed=TRUE)))

contribs <- read.csv("path/to/file", colClasses=c(CTRIB_AMT="Currency"))

【讨论】:

    【解决方案3】:

    很久以前解决的问题的另一种解决方案:

    convertCurrency <- function(currency) {
      currency1 <- sub('$','',as.character(currency),fixed=TRUE)
      currency2 <- as.numeric(gsub('\\,','',as.character(currency1))) 
      currency2
    }
    
    contribs$CTRIB_AMT_NUM <- convertCurrency(contribs$CTRIB_AMT)
    

    【讨论】:

      【解决方案4】:

      利用readr 包提供的强大解析器,开箱即用:

      my_parser <- function(col) {
        # Try first with parse_number that handles currencies automatically quite well
        res <- suppressWarnings(readr::parse_number(col))
        if (is.null(attr(res, "problems", exact = TRUE))) {
          res
        } else {
          # If parse_number fails, fall back on parse_guess
          readr::parse_guess(col)
          # Alternatively, we could simply return col without further parsing attempt
        }
      }
      
      library(dplyr)
      
      name <- c('john','carl', 'hank')
      salary <- c('$23,456.33','$45,677.43','$76,234.88')
      emp_data <- data.frame(name,salary)
      
      emp_data %>% 
        mutate(foo = "USD13.4",
               bar = "£37") %>% 
        mutate_all(my_parser)
      
      #   name   salary  foo bar
      # 1 john 23456.33 13.4  37
      # 2 carl 45677.43 13.4  37
      # 3 hank 76234.88 13.4  37
      

      【讨论】:

        【解决方案5】:

        或者使用 as.numeric(substr(as.character(contribs$CTRIB_AMT),2,20)) 这样的东西,我们知道肯定不会超过 20 个字符。

        要注意的另一件事是,如果您在对read.csv() 的调用中设置stringsAsFactors=F,则可以完全消除转换因子的需要

        【讨论】:

          【解决方案6】:

          现在也许是一个更现代的答案:

          readr 包中的read_csv 有一个col_number() 解析器,可以处理逗号分隔符和货币符号。

          只是用来解析一些从纳斯达克下载的股票数据:

          # Downloaded from https://www.nasdaq.com/market-activity/stocks/amzn/historical
          AMZN <- 
            read_csv("data/AMZN_HistoricalData_1640763915240.csv", 
              col_types = cols(
                Date = col_date(format = "%m/%d/%Y"),
                `Close/Last` = col_number(),
                Volume = col_integer(),
                Open = col_number(),
                High = col_number(),
                Low = col_number())
            )
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-25
            • 1970-01-01
            • 1970-01-01
            • 2015-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多