2014-10-06 18 views
7

Tôi mới đến reshape2data.table và cố gắng tìm hiểu cú pháp.trong R, tùy chỉnh tên của các cột được tạo bởi dcast.data.table

Tôi có một data.table mà tôi muốn truyền từ nhiều hàng cho mỗi nhóm (các) biến thành một hàng cho mỗi biến nhóm. Để đơn giản, hãy biến nó thành một bảng khách hàng, một số trong số đó chia sẻ địa chỉ.

library(data.table) 

# Input table: 
cust <- data.table(name=c("Betty","Joe","Frank","Wendy","Sally"), 
        address=c(rep("123 Sunny Rd",2), 
          rep("456 Cloudy Ln",2), 
           "789 Windy Dr")) 

Tôi muốn đầu ra có định dạng sau:

# Desired output looks like this: 
(out <- data.table(address=c("123 Sunny Rd","456 Cloudy Ln","789 Windy Dr"), 
        cust_1=c("Betty","Frank","Sally"), 
        cust_2=c("Joe","Wendy",NA))) 

#   address cust_1 cust_2 
# 1: 123 Sunny Rd Betty Joe 
# 2: 456 Cloudy Ln Frank Wendy 
# 3: 789 Windy Dr Sally  NA 

Tôi muốn các cột cho cust_1 ... cust_n trong đó n là khách hàng tối đa cho mỗi địa chỉ. Tôi không thực sự quan tâm đến thứ tự - liệu Joe có phải là cust_1 hay Betty là cust_2 hay ngược lại.

Trả lời

9

Just pushed a commit để data.table v1.9.5. dcast tại

  • cho phép đúc trên nhiều value.var cột và nhiều chức năng fun.aggregate
  • hiểu khi không xác định biến/biểu thức trong công thức

Với điều này, chúng ta có thể làm:

dcast(cust, address ~ paste0("cust", cust[, seq_len(.N), 
      by=address]$V1), value.var="name") 
#   address cust1 cust2 
# 1: 123 Sunny Rd Betty Joe 
# 2: 456 Cloudy Ln Frank Wendy 
# 3: 789 Windy Dr Sally NA 
+1

Đẹp, TYVM – C8H10N4O2

4
# My attempt: 
setkey(cust,address) 
x <- cust[,list(name, addr_cust_num=rank(name,ties.method="random")), by=address]) 
x[,addr_cust_num:=paste0("cust_",addr_cust_num)] 
y <- dcast.data.table(x, address ~ addr_cust_num, value.var="name") 
y 

Lưu ý rằng tôi phải paste0 tiền tố "cust_". Trước khi tôi thêm bước đó, tôi đã sử dụng setnames(y, names(y), sub("(\\d+)","cust_\\1",names(y))) mà dường như một giải pháp clunkier (nhưng có lẽ nhanh hơn).

Tự hỏi nếu có cách nào tốt hơn để thực hiện tiền tố.


Ngoài ra, bạn chỉ có thể thêm cột trực tiếp đến custbằng cách tham khảo:

# no need to set key 
cust[, cust := paste("cust", seq_len(.N), sep="_"), by=address] 
dcast.data.table(cust, address ~ cust, value.var="name") 
#   address cust_1 cust_2 
# 1: 123 Sunny Rd Betty Joe 
# 2: 456 Cloudy Ln Frank Wendy 
# 3: 789 Windy Dr Sally  NA 
+1

Tôi đã thêm một phiên bản rất giống nhau, nhưng tôi đồng ý sẽ rất tuyệt nếu chúng ta có thể tránh được bước đầu tiên. Bạn có thể vui lòng gửi một vấn đề [ở đây] (https://github.com/Rdatatable/data.table)? Cảm ơn. – Arun

+1

@ Chạy OK, cảm ơn, đã gửi. – C8H10N4O2

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