2014-10-06 37 views
7

我是reshape2data.table的新手,並試圖學習語法。在R中,自定義由dcast.data.table創建的列的名稱

我有一個data.table,我想從每個變量分組多個行轉換爲每個分組變量(s)一行。爲了簡單起見,讓我們把它作爲一個客戶的表格,其中一些分享地址。

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")) 

我所要的輸出格式如下:

# 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 

我想爲cust_1 ... cust_n其中n是最大的客戶每個地址列。我並不關心訂單 - 無論Joe是cust_1還是Betty是cust_2,反之亦然。

回答

9

Just pushed a commitdata.table v1.9.5dcast現在

  • 允許鑄造多個value.var列和多fun.aggregate功能
  • 理解不確定變量/式表達

有了這個,我們可以這樣做:

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

美麗的TYVM – C8H10N4O2 2015-06-19 22:19:23

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 

請注意,我不得不paste0「cust_」前綴。在我添加該步驟之前,我正在使用setnames(y, names(y), sub("(\\d+)","cust_\\1",names(y))),這似乎是一種更笨拙(但可能更快)的解決方案。

想知道是否有更好的方法來做前綴。


或者,你可以只直接引用添加列cust

# 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

我已經增加了一個非常相似的版本,但我同意如果我們可以避免第一步就會很好。你能否提出一個問題[這裏](https://github.com/Rdatatable/data.table)?謝謝。 – Arun 2014-10-06 21:49:24

+1

@阿倫好,謝謝,提交。 – C8H10N4O2 2014-10-08 17:11:20