2011-09-07 31 views
8

Tôi đang cố đọc vào tập tin csv có chứa thông tin về các đóng góp chính trị. Từ những gì tôi hiểu, các cột theo mặc định được nhập dưới dạng các yếu tố, nhưng tôi cần cột số lượng ('CTRIB_AMT' trong tập dữ liệu) để được nhập dưới dạng cột số để tôi có thể chạy nhiều chức năng không hoạt động cho các yếu tố. Cột được định dạng là đơn vị tiền tệ có tiền tố "$" làm tiền tố.Đọc tập tin csv trong R với cột tiền tệ như số

tôi đã sử dụng một lệnh đọc đơn giản để nhập khẩu các tập tin ban đầu:

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

Và sau đó cố gắng để chuyển đổi từ CTRIB_AMT tệ số:

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

Nhưng điều đó không làm việc. Các chức năng tôi đang cố gắng sử dụng cho các cột CTRIB_AMT là:

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

Xem câu hỏi liên quan here.

Bất kỳ suy nghĩ nào về cách nhập tệp ban đầu để cột là số hoặc cách chuyển đổi sau khi nhập?

+1

Ví dụ nhỏ về nội dung tệp sẽ hữu ích. –

+0

Chuyển đổi 'sub' ->' as.character' -> 'as.numeric' sẽ thực hiện thủ thuật. Bạn có ý gì khi "không làm việc"? –

+1

Làm việc cho tôi. 'CTRIB_AMT <- factor (c (" $ 5000 "," $ 2500 "," $ 100 ")); as.numeric (as.character (sub ("$", "", CTRIB_AMT, fixed = TRUE))) ' –

Trả lời

14

Tôi không chắc chắn làm thế nào để đọc nó trực tiếp, nhưng bạn có thể thay đổi nó khi nó ở:

> 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 

Tôi nghĩ rằng nó có thể chỉ là một lối thoát còn thiếu trong phụ của bạn. $ cho biết kết thúc của một dòng trong các biểu thức chính quy. \ $ là ký hiệu đô la. Nhưng sau đó bạn phải thoát khỏi sự trốn thoát ...

+0

Ban đầu tôi nghĩ có một lối thoát còn thiếu, nhưng' fixed = TRUE' sẽ xử lý điều đó .. –

+0

Có lẽ tchaymore quên làm bài tập? – Zach

+8

+1 Tôi cũng tìm thấy 'gsub (" [$,] "," ",'.. Hữu ích cho các số liệu như '" $ 1,234 "'. –

2

Hoặc sử dụng một cái gì đó như as.numeric(substr(as.character(contribs$CTRIB_AMT),2,20)) chúng tôi biết rằng chắc chắn sẽ không có nhiều hơn 20 ký tự.

Một điều cần lưu ý là bạn có thể loại bỏ sự cần để chuyển đổi từ một yếu tố alltogether nếu bạn thiết lập stringsAsFactors=F trong lệnh gọi read.csv()

7

Một cách khác có thể được thiết lập chuyển đổi sử dụng setAs.
Nó được sử dụng trong hai (tương tự) câu hỏi:

Đối với nhu cầu của bạn:

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

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

Tuy nhiên, một giải pháp cho một vấn đề được giải quyết từ lâu rồi :

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) 
Các vấn đề liên quan