Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在data.table中分组:如何获得多于一列的结果?_R_Data.table - Fatal编程技术网

R 在data.table中分组:如何获得多于一列的结果?

R 在data.table中分组:如何获得多于一列的结果?,r,data.table,R,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,

我有一个像这样的
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)
哪种产品

> 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
我想将这两个函数合并为一个,以生成一个包含3列的矩阵(或data.table、data.frame等),第一列包含
PERMNO
s,第二列包含
mktcap
,第三列包含
sqrt

问题在于,此分组函数(即
变量[,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]
(结果都在那里,但它们被强制放在一列中)。无论我尝试什么,我都无法让分组返回一个包含两列以上(或一列以上结果)的矩阵

data.table
中分组是否可以得到两列或更多的结果?

答案(使用
list()
收集多个所需的汇总统计数据)位于
data.table
帮助文件的“优秀示例”部分。(从底部向上大约20行)

怎么样

comb.fun <- function(a) {
 mktcap <- a[ , tail(SHROUT,n=1)*tail(PRC,n=1),by=PERMNO]
 sqret <- a[, sum(RET^2),by=PERMNO]

 return(merge(mktcap,sqret))
} 

comb.fun这很好,但是我可以要list(function())吗?我这样问是因为我给出的例子是我需要做的一个非常简化的版本。我希望有一个返回5个结果的函数,并且计算不是像我提供的那样的一行计算……你的意思是像
a[,{r@Vivi,只是提到另一个构造作为进一步的选项。而不是
j=myfunction()
(如果不费力地传递所有参数,它将无法工作)您可以创建一个表达式(使用
quote()
而不是
function()
)。它有点像一个宏。然后它是
j=eval(mymacro)
而不是
j=myfunction()
。有关详细示例,请参阅FAQ 1.6。这可能比函数调用更有效,也更方便。当
数据时。table
看到
j=eval(mymacro)
它知道如何在调用范围中找到
mymacro
,这样在列名被调用
mymacro
时就不会被绊倒。@MatthewDowle——这是一个很好的解释。对我来说,它比FAQ 1.6更有效,我已经一遍又一遍地阅读了它,但始终没有完全理解。我认为与之平行功能(这是我们在这种情况下自然要达到的)真的很有帮助。谢谢。@JoshO'Brien谢谢你为Matthew的评论添加了一个例子,这真的很有帮助。我的问题是我在一个分组中有一个分组。你的案例是有效的,但是当它进入上面级别的分组时,它会再次转换为两列……而且,一个
by
query比两个
by更有效
query.Cool。最后几个小错误被证明很难解决,但希望1.8.1很快就会出现在CRAN上…@ttmaccer回过头来看我的问题,我同意我问的不是很清楚。老实说,我也不确定我想要什么能与嵌套分组一起工作,但这正是我试图做的。我不知道合并(我总是使用cbind、rbind或c),为此干杯。+1为这个可重复性很好的例子,为从Matthew Dowle那里得到如此清晰的“宏表达式”解释而干杯。谢谢。
     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
out <- a[ , list(mktcap = tail(SHROUT,n=1)*tail(PRC,n=1),
                 sqret  = sum(RET^2)),
         by=PERMNO]

out
#    PERMNO   mktcap     sqret
# 1:  10006 8740.375 5.000e-05
# 2:  10015  500.500 2.501e-03
# 3:  20000  800.000 1.361e-05
## 1) Use quote() to make an expression object out of the statement passed to j
mm <- quote(list(mktcap = tail(SHROUT,n=1)*tail(PRC,n=1),
                 sqret  = sum(RET^2)))

## 2) Use eval() to evaluate it as if it had been typed directly in the call
a[ , eval(mm), by=PERMNO]
#    PERMNO   mktcap     sqret
# 1:  10006 8740.375 5.000e-05
# 2:  10015  500.500 2.501e-03
# 3:  20000  800.000 1.361e-05
comb.fun <- function(a) {
 mktcap <- a[ , tail(SHROUT,n=1)*tail(PRC,n=1),by=PERMNO]
 sqret <- a[, sum(RET^2),by=PERMNO]

 return(merge(mktcap,sqret))
}