2013-06-06 28 views
7

Tôi có tệp csv trong đó tên cột bao gồm dấu cách và ký tự đặc biệt.fread từ gói data.table khi tên cột bao gồm dấu cách và ký tự đặc biệt?

fread nhập chúng bằng dấu ngoặc kép - nhưng làm cách nào để thay đổi hành vi này? Một lý do là tôi có tên cột bắt đầu bằng một khoảng trắng và tôi không biết cách xử lý chúng.

Mọi con trỏ sẽ hữu ích.

Chỉnh sửa: Ví dụ.

> packageVersion("data.table") 
[1] ‘1.8.8’ 

p2p <- fread("p2p.csv", header = TRUE, stringsAsFactors=FALSE) 

> head(p2p[,list(Principal remaining)]) 
Error: unexpected symbol in "head(p2p[,list(Principal remaining" 

> head(p2p[,list("Principal remaining")]) 
        V1 
1: Principal remaining 

> head(p2p[,list(c("Principal remaining"))]) 
        V1 
1: Principal remaining 

gì tôi đã mong đợi/muốn là tất nhiên, những gì một tên cột mà không sản lượng không gian:

> head(p2p[,list(Principal)]) 
    Principal 
1:  1000 
2:  1000 
3:  1000 
4:  2000 
5:  1000 
6:  4130 

Trả lời

5

Nó sẽ được khá khó khăn để có được một không gian hàng đầu trong một tên cột. Không nên xảy ra bởi "mã hóa thông thường". Mặt khác tôi không thấy rất nhiều kiểm tra lỗi trong mã fread, như vậy có lẽ cho đến khi hành vi không mong muốn này là cố định, (hoặc các yêu cầu tính năng từ chối), bạn có thể làm một cái gì đó như thế này:

setnames(DT, make.names(colnames(DT))) 

Nếu mặt khác, bạn bị làm phiền bởi thực tế là colnames(DT) sẽ hiển thị tên cột có dấu ngoặc kép sau đó chỉ cần "vượt qua nó". Đó là cách giao diện điều khiển tương tác sẽ hiển thị bất kỳ giá trị ký tự nào.

Nếu bạn có một mục dữ liệu trong cột ký tự trông giống như " ttt" trong bản gốc, nó sẽ có khoảng trắng hàng đầu khi được nhập và bạn cần xử lý bằng colnames(dfrm) <- sub("^\\s+", "", colnames(dfrm)) hoặc một trong các chức năng trim trong các gói khác nhau (chẳng hạn như 'gdata')

+0

Tôi sẽ cố gắng con đường tiểu/gsub. Cảm ơn. – Rico

+0

Bạn có thể muốn cập nhật câu trả lời của bạn với điều này. 'Thông điệp cảnh báo: Trong tên <-. Data.table (* tmp *, value = value): Cú pháp giá trị colnames (x) <- bản sao chép toàn bộ bảng. Điều này là do <- trong R chính nó. Vui lòng thay đổi thành tên đặt (x, cũ, mới) mà không sao chép và nhanh hơn. Xem trợ giúp ('setnames'). Bạn có thể bỏ qua cảnh báo này một cách an toàn nếu bất tiện thay đổi ngay bây giờ. Thiết lập tùy chọn (warn = 2) biến cảnh báo này thành lỗi, vì vậy bạn có thể sử dụng traceback() để tìm và thay đổi tên của bạn <- calls.' – Rico

+0

Điểm tuyệt vời và tôi sửa đổi câu trả lời để phản ánh điều đó. –

9

Một chút sửa đổi BondedDust phiên bản, vì setnames chức năng không được sử dụng với < - dấu hiệu:

setnames(DT, make.names(colnames(DT)) 
+0

Tốt nhất. David Arenburg cố định. Tôi khá xấu hổ vì tôi đã làm điều đó và ngạc nhiên về lỗi đã tồn tại trong hơn một năm. –

0

Bạn có thể sử dụng check.names luận = T trong chức năng fread của data.table

p2p <- fread("p2p.csv", header = TRUE, stringsAsFactors=FALSE, check.names=T) 

Nó sử dụng make.names chức năng ở chế độ nền

default is FALSE. If TRUE then the names of the variables in the data.table 
are checked to ensure that they are syntactically valid variable names. If 
necessary they are adjusted (by make.names) so that they are, and also to 
ensure that there are no duplicates. 
Các vấn đề liên quan