我正在尝试阅读R a csv文件,其中包含有关政治捐款的信息。根据我的理解,默认情况下将列导入为因子,但我需要将amount列(数据集中的“CTRIB_AMT”)导入为数字列,以便我可以运行各种不适用的函数因素。该列的格式为货币,前缀为“$”。
我使用了一个简单的read命令来最初导入文件:
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。
有关如何最初导入文件的任何想法所以列是数字或导入后如何转换它?
我不确定如何直接阅读它,但你可以修改它:
> 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
我认为它可能只是你的潜艇中失踪的逃脱。 $表示正则表达式中行的结尾。 \ $是一个美元符号。但是你必须逃脱逃脱......
另一种方法是使用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"))
很久以前解决问题的又一个解决方案:
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)
或者使用像as.numeric(substr(as.character(contribs$CTRIB_AMT),2,20))
这样的东西我们知道肯定不会超过20个字符。
另外需要注意的是,如果在调用qazxsw poi时设置qazxsw poi,则可以完全不需要转换因子
利用强大的解析器,stringsAsFactors=F
包提供开箱即用:
read.csv()