我想获得与data.table
融合产生的相同输出,而不使用熔体并标记它。
DT <- data.table(date=as.IDate(datetime), value=rnorm(10))
DT_melt <- DT[,as.list(summary(value)), by=date]
melt(DT_melt,"date")
结果:
date variable value
1: 2001-01-01 Min. -0.9122
2: 2001-01-02 Min. -1.2220
3: 2001-01-01 1st Qu. 0.3462
4: 2001-01-02 1st Qu. -0.8932
5: 2001-01-01 Median 0.6230
6: 2001-01-02 Median -0.2470
7: 2001-01-01 Mean 0.4189
8: 2001-01-02 Mean -0.3418
9: 2001-01-01 3rd Qu. 0.7913
10: 2001-01-02 3rd Qu. 0.2526
11: 2001-01-01 Max. 1.2460
12: 2001-01-02 Max. 0.4010
我想在不融化的情况下实现这一目标。
到目前为止,我设法通过手动标记它来获得它:
labels <- names(summary(1))
DT[,list(labels,value=unclass(summary(value))), by=date]
但有没有办法在unclass(summary(value))
内使用data.table
的名字?
像
DT[,c("labels","value"):=unclass(summary(value)), by=date, use.names = TRUE]
答案 0 :(得分:2)
您可以创建如下函数:
myFun <- function(x) {
A <- summary(x)
list(variable = names(A),
value = unlist(A, use.names = FALSE))
}
以下是正在使用的功能示例。
首先,一些可重复的数据:
datetime <- as.Date("2001-01-01") + 0:1
set.seed(1)
DT <- data.table(date=as.IDate(datetime), value=rnorm(10))
其次,应用该功能:
DT[, myFun(value), by = date]
# date variable value
# 1: 2001-01-01 Min. -0.83560
# 2: 2001-01-01 1st Qu. -0.62650
# 3: 2001-01-01 Median 0.32950
# 4: 2001-01-01 Mean -0.01387
# 5: 2001-01-01 3rd Qu. 0.48740
# 6: 2001-01-01 Max. 0.57580
# 7: 2001-01-02 Min. -0.82050
# 8: 2001-01-02 1st Qu. -0.30540
# 9: 2001-01-02 Median 0.18360
# 10: 2001-01-02 Mean 0.27830
# 11: 2001-01-02 3rd Qu. 0.73830
# 12: 2001-01-02 Max. 1.59500
其他替代方案可能是:
DT[, stack(summary(value)), by = date]
DT[, as.list(summary(value)), by = date][, list(
variable = names(.SD), value = unlist(.SD)), by = date]
DT[, list(labels = names(summary(1)),
value = summary(value)), by = date]
我不确定为什么你不想只使用melt
。 <{1}}上的melt
非常有效。