在R中,自定义由dcast.data.table创建的列的名称

问题描述:

我是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,反之亦然。

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

# 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