在 R 中,自定义由 dcast.data.table 创建的列的名称
Posted
技术标签:
【中文标题】在 R 中,自定义由 dcast.data.table 创建的列的名称【英文标题】:in R, customize names of columns created by dcast.data.table 【发布时间】:2014-12-01 05:49:18 【问题描述】:我是 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"))
我希望输出具有以下格式:
# 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 还是反之亦然。
【问题讨论】:
【参考方案1】: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
【讨论】:
【参考方案2】:# 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
【讨论】:
我添加了一个非常相似的版本,但我同意如果我们能避免第一步,那就太好了。你能提交一个问题here吗?谢谢。以上是关于在 R 中,自定义由 dcast.data.table 创建的列的名称的主要内容,如果未能解决你的问题,请参考以下文章