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

C8H*_*4O2 10 pivot-table r reshape2 data.table

我是新手reshape2,data.table并试图学习语法.

我有一个data.table我想从每个分组变量的多行转换为每个分组变量一行.为简单起见,我们让它成为一个客户表,其中一些客户共享地址.

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"))
Run Code Online (Sandbox Code Playgroud)

我希望输出具有以下格式:

# 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
Run Code Online (Sandbox Code Playgroud)

我想要cust_1 ... cust_n的列,其中n是每个地址的最大客户数.我并不关心订单 - Joe是否是cust_1而Betty是cust_2,反之亦然.

Aru*_*run 14

只是把提交data.table v1.9.5.dcast现在

  • 允许在多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
Run Code Online (Sandbox Code Playgroud)


C8H*_*4O2 5

# 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
Run Code Online (Sandbox Code Playgroud)

请注意,我必须添加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
Run Code Online (Sandbox Code Playgroud)