使用 reshape2:::dcast 转置 data.table
Transposing a data.table with reshape2:::dcast
我正在转置 data.table 并选择使用 reshape2:::dcast
,但是我对 data.table 的奇怪处理感到困扰...这是一个玩具数据集复制行为:
> library(data.table)
> library(reshape2)
> DT <- structure(list(STORE = c(32123L, 32469L, 33177L, 33484L, 34772L, 34875L),
VOLUME = c(343.87205, 599.78335, 1665.90895, 712.0343, 465.6489, 622.5189)),
.Names = c("STORE", "VOLUME"),
sorted = "STORE",
class = c("data.table", "data.frame"),
row.names = c(NA, -6L))
> (R1 <- dcast(DT, . ~ STORE, value.var = "VOLUME"))
. 32123 32469 33177 33484 34772 34875
1 . 343.8721 599.7834 1665.909 712.0343 465.6489 622.5189
完美,正是我想要的样子(删除 .
列没什么大不了的)——但它不再归类为 data.table:
> class(R1)
[1] "data.frame"
我试图在 data.table 包中显式调用 data.tables 的方法,但 R 现在不喜欢这个公式:
> data.table:::dcast.data.table(DT, . ~ STORE, value.var = "VOLUME")
Error in data.table:::dcast.data.table(DT, . ~ STORE, value.var = "VOLUME") :
LHS of formula evaluates to 'character(0)', invalid formula.
2: stop("LHS of formula evaluates to 'character(0)', invalid formula.")
1: data.table:::dcast.data.table(DT, . ~ STORE, value.var = "VOLUME")
这可以通过创建一个在转置后删除的虚拟主元列轻松解决:
> DT[, "dummy" := NA]
> (R2 <- data.table:::dcast.data.table(DT, dummy ~ STORE, value.var = "VOLUME"))
dummy 32123 32469 33177 33484 34772 34875
1: NA 343.8721 599.7834 1665.909 712.0343 465.6489 622.5189
> class(R2)
[1] "data.table" "data.frame"
然而,data.table:::dcast.data.table
没有处理转换公式的 NULL LHS 这一事实让我相信我正在做这一切都是错误的 - 有没有 "data.table" 方法来做这个?
在 data.table 中,您不需要 dcast 来完成您想要的重塑。只需使用
DT[, as.list(setNames(VOLUME, STORE))]
解释:
在[.data.table
中,如果j
表达式(即DT[i, j]
)是一个list
,列表被认为是输出的列。
列表的名字取为列名(缺失的名字用V*
)
例如:
DT[, j= list(ABC=123, greetings="Hello World", 1, alpha = 0.9995)]
# ABC greetings V3 alpha
# 1: 123 Hello World 1 0.9995
因此在解决方案中:
setnNames
(base R
函数。不要与 data.table
包中的 setnames
混淆)应用一个向量作为另一个向量的名称。
- 将向量转换为
list
告诉 [.data.table
将它们视为列。
(或者,您可以将其保留为命名向量,如果这是您的目的所需要的话)
直播问题
至于 reshape2::dcast
和 dcast.data.table
之间的区别,正如@David Arenburg 在上面的评论中指出的那样,这已在 data.table 的开发版本中得到解决 github 并将与 V1.9.6
一起出现在 CRAN 上
library (devtools)
install_github("Rdatatable/data.table")
我正在转置 data.table 并选择使用 reshape2:::dcast
,但是我对 data.table 的奇怪处理感到困扰...这是一个玩具数据集复制行为:
> library(data.table)
> library(reshape2)
> DT <- structure(list(STORE = c(32123L, 32469L, 33177L, 33484L, 34772L, 34875L),
VOLUME = c(343.87205, 599.78335, 1665.90895, 712.0343, 465.6489, 622.5189)),
.Names = c("STORE", "VOLUME"),
sorted = "STORE",
class = c("data.table", "data.frame"),
row.names = c(NA, -6L))
> (R1 <- dcast(DT, . ~ STORE, value.var = "VOLUME"))
. 32123 32469 33177 33484 34772 34875
1 . 343.8721 599.7834 1665.909 712.0343 465.6489 622.5189
完美,正是我想要的样子(删除 .
列没什么大不了的)——但它不再归类为 data.table:
> class(R1)
[1] "data.frame"
我试图在 data.table 包中显式调用 data.tables 的方法,但 R 现在不喜欢这个公式:
> data.table:::dcast.data.table(DT, . ~ STORE, value.var = "VOLUME")
Error in data.table:::dcast.data.table(DT, . ~ STORE, value.var = "VOLUME") :
LHS of formula evaluates to 'character(0)', invalid formula.
2: stop("LHS of formula evaluates to 'character(0)', invalid formula.")
1: data.table:::dcast.data.table(DT, . ~ STORE, value.var = "VOLUME")
这可以通过创建一个在转置后删除的虚拟主元列轻松解决:
> DT[, "dummy" := NA]
> (R2 <- data.table:::dcast.data.table(DT, dummy ~ STORE, value.var = "VOLUME"))
dummy 32123 32469 33177 33484 34772 34875
1: NA 343.8721 599.7834 1665.909 712.0343 465.6489 622.5189
> class(R2)
[1] "data.table" "data.frame"
然而,data.table:::dcast.data.table
没有处理转换公式的 NULL LHS 这一事实让我相信我正在做这一切都是错误的 - 有没有 "data.table" 方法来做这个?
在 data.table 中,您不需要 dcast 来完成您想要的重塑。只需使用
DT[, as.list(setNames(VOLUME, STORE))]
解释:
在[.data.table
中,如果j
表达式(即DT[i, j]
)是一个list
,列表被认为是输出的列。
列表的名字取为列名(缺失的名字用V*
)
例如:
DT[, j= list(ABC=123, greetings="Hello World", 1, alpha = 0.9995)]
# ABC greetings V3 alpha
# 1: 123 Hello World 1 0.9995
因此在解决方案中:
setnNames
(base R
函数。不要与data.table
包中的setnames
混淆)应用一个向量作为另一个向量的名称。- 将向量转换为
list
告诉[.data.table
将它们视为列。
(或者,您可以将其保留为命名向量,如果这是您的目的所需要的话)
直播问题
至于 reshape2::dcast
和 dcast.data.table
之间的区别,正如@David Arenburg 在上面的评论中指出的那样,这已在 data.table 的开发版本中得到解决 github 并将与 V1.9.6
library (devtools)
install_github("Rdatatable/data.table")