在R中,自定义由dcast.data.table创建的列的名称
问题描述:
我是reshape2
和data.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 commit到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
答
# 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
美丽的TYVM – C8H10N4O2 2015-06-19 22:19:23