我有一个像这样的
我希望将这两个功能合并为一个,生成一个矩阵(或数据表、数据框等),其中有三列,第一列是
问题在于,这个分组函数(即
以下是我的尝试之一,旨在生成我想要的结果:
产生的
所有的结果都在那里,但它们被强制放在一列中。无论我尝试什么,我都无法使分组返回一个具有两列或多列(或多个结果列)的矩阵。在data.table中,是否可能通过分组获取两列或多列的结果?
data.table
对象。library(data.table)
a <- structure(list(PERMNO = c(10006L, 10006L, 10015L, 10015L, 20000L, 20000L),
SHROUT = c(1427L, 1427L, 1000L, 1001L, 200L, 200L),
PRC = c(6.5, 6.125, 0.75, 0.5, 3, 4),
RET = c(0.005, -0.005, -0.001, 0.05, -0.002, 0.0031)),
.Names = c("PERMNO", "SHROUT", "PRC", "RET"),
class = c("data.table", "data.frame"), row.names = c(NA, -6L))
setkey(a,PERMNO)
我需要通过 PERMNO
进行一系列的计算,但在这个例子中我们只假设有两个:
mktcap <- a[ , tail(SHROUT,n=1)*tail(PRC,n=1),by=PERMNO]
sqret <- a[, sum(RET^2),by=PERMNO]
这些产生
> mktcap
PERMNO V1
[1,] 10006 8740.375
[2,] 10015 500.500
[3,] 20000 800.000
> sqret
PERMNO V1
[1,] 10006 5.000e-05
[2,] 10015 2.501e-03
[3,] 20000 1.361e-05
我希望将这两个功能合并为一个,生成一个矩阵(或数据表、数据框等),其中有三列,第一列是
PERMNO
,第二列是mktcap
,第三列是sqrt
。问题在于,这个分组函数(即
variable[ , function(), by= ]
)似乎只能生成两列结果,一列是键,一列是结果。以下是我的尝试之一,旨在生成我想要的结果:
comb.fun <- function(datai) {
mktcap <- as.matrix(tail(datai[,1],n=1)*tail(datai[,2],n=1),ncol=1)
sqret <- as.matrix(sum(datai[,3]^2),ncol=1)
return(c(mktcap,sqret))
}
myresults <- a[, comb.fun(cbind(SHROUT,PRC,RET)), by=PERMNO]
产生的
PERMNO V1
[1,] 10006 8.740375e+03
[2,] 10006 5.000000e-05
[3,] 10015 5.005000e+02
[4,] 10015 2.501000e-03
[5,] 20000 8.000000e+02
[6,] 20000 1.361000e-05
所有的结果都在那里,但它们被强制放在一列中。无论我尝试什么,我都无法使分组返回一个具有两列或多列(或多个结果列)的矩阵。在data.table中,是否可能通过分组获取两列或多列的结果?