13

我正在尝试将包含政治捐款信息的 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)

在此处查看相关问题。

关于如何最初导入文件以便列是数字或导入后如何转换它的任何想法?

4

6 回答 6

18

我不确定如何直接读取它,但是一旦它进入,您就可以对其进行修改:

> 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

我认为这可能只是您的潜艇失踪了。$ 表示正则表达式中的行尾。\$ 是美元符号。但是你必须逃避逃跑......

于 2011-09-07T17:48:47.020 回答
13

另一种方法是使用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"))
于 2011-09-08T10:43:38.867 回答
5

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

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)
于 2013-04-07T19:30:35.910 回答
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
于 2018-07-16T15:17:08.677 回答
2

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

另一件需要注意的事情是,如果您stringsAsFactors=F在调用中设置为read.csv()

于 2011-09-07T17:28:05.833 回答
0

现在可能有一个更现代的答案:

read_csv来自readr包的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())
  )
于 2021-12-29T08:38:14.350 回答