2012-09-20 45 views
5

Có thể thay đổi dấu phân cách mặc định khi truyền (dcast) gán tiêu đề cột mới không?Thay đổi dấu phân cách mặc định trong diễn viên

Tôi đang chuyển đổi một tập tin từ lâu để rộng, và tôi nhận các tiêu đề sau:

value_1, value_2, value_3,... 

Trong Reshape bạn có thể gán "sep" tham số (Tháng Chín = "") và đầu ra cột tiêu đề như tôi muốn họ:

value1, value2, value3,... 

Tuy nhiên, định hình lại mất vài phút cho khung dữ liệu của tôi với hơn 200.000 hàng, trong khi dcast mất vài giây. dcast cũng xuất ra các cột theo thứ tự tôi muốn, trong đó định dạng lại không. Có cách nào dễ dàng để thay đổi đầu ra với dcast, hoặc tôi cần phải thay đổi các tiêu đề cột bằng tay?

Ví dụ:

example <- data.frame(id=rep(c(1,2,3,4),4),index=c(rep(1,4),rep(2,4),rep(1,4),rep(2,4)),variable=c(rep("resp",8),rep("conc",8)),value=rnorm(16,5,1)) 
dcast(example,id~variable+index) 

Ví dụ cho các tiêu đề cột:

conc_1, conc_2, resp_1, resp_2 

Tôi muốn các tiêu đề cột để đọc:

conc1, conc2, resp1, resp2 

Tôi đã thử:

dcast(example,id~variable+index,sep="") 

dcast xuất hiện để bỏ qua hoàn toàn sep, bởi vì cho một biểu tượng không thay đổi đầu ra hoặc.

+0

Vui lòng bao gồm ví dụ có thể tái sản xuất. –

+0

@mplourde Tôi đã thêm một ví dụ. – dayne

Trả lời

3

Bạn không thể, vì tùy chọn đó không được tích hợp vào dcast. Nhưng nó khá tầm thường để làm điều này sau khi chạy dcast.

casted_data <- dcast(example,id~variable+index) 


library(stringr) 
names(casted_data) <- str_replace(names(casted_data), "_", ".") 

> casted_data 
    id conc.1 conc.2 resp.1 resp.2 
1 1 5.554279 5.225686 5.684371 5.093170 
2 2 4.826810 5.484334 5.270886 4.064688 
3 3 5.650187 3.587773 3.881672 3.983080 
4 4 4.327841 4.851891 5.628488 4.305907 

# If you need to do this often, just wrap dcast in a function and 
# change the names before returning the result. 

f <- function(df, ..., sep = ".") { 
    res <- dcast(df, ...) 
    names(res) <- str_replace(names(res), "_", sep) 
    res 
} 

> f(example, id~variable+index, sep = "") 
    id conc1 conc2 resp1 resp2 
1 1 5.554279 5.225686 5.684371 5.093170 
2 2 4.826810 5.484334 5.270886 4.064688 
3 3 5.650187 3.587773 3.881672 3.983080 
4 4 4.327841 4.851891 5.628488 4.305907 
+0

Tôi biết việc thay thế tên là dễ dàng, nhưng tôi đang tìm kiếm một cách xung quanh nếu có thể. Tôi cũng có các tiêu đề cột khác với dấu gạch dưới, vì vậy sẽ cần thêm một vài dòng mã - mặc dù nó vẫn đủ dễ dàng. – dayne

+0

Đây là cách thức xung quanh. Bạn có thể viết lại 'dcast' và các hàm bên trong từ' reshape2' nhưng điều đó sẽ làm việc nhiều hơn và hoàn toàn không cần thiết. Gói trong một hàm sẽ để nó ở cùng một số dòng mã (chỉ 1) – Maiasaura

+0

Cảm ơn cả hai. – dayne

1

Một lựa chọn:

example <- data.frame(example,by=paste(example$variable,example$index,sep="")) 
dcast(example,id~by) 
2

dcast trong gói data.table (dev phiên bản 1.9.5) bây giờ có tranh cãi 'Tháng chín'.

+0

1.9.5 là lỗi thời và @arekolek ở trên cung cấp câu trả lời đầy đủ hơn về việc mở rộng câu trả lời này – MichaelChirico

2

Dựa trên information provided by dbetebenner và một ví dụ về using data.table for improved dcast functionality, ví dụ của bạn trở thành:

> library(data.table) 
> dcast(setDT(example), id ~ variable + index, sep="") 
    id conc1 conc2 resp1 resp2 
1: 1 5.113707 5.475527 5.938592 4.149636 
2: 2 4.261278 6.138082 5.277773 5.907054 
3: 3 4.350663 4.292398 6.277582 4.167552 
4: 4 5.993198 6.601669 5.232375 5.037936 

setDT() chuyển đổi danh sách và data.frames-data.tables bằng cách tham khảo.

Đã thử nghiệm với data.table v1.9.6.

Các vấn đề liên quan