[英]Grouping in data.table: how to get more than 1 column of results?
我有一個像這樣的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
執行一些計算,但是在這個例子中我們假設它們只有2:
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
我想把這兩個函數組合成一個,用3列產生矩陣(或data.table,data.frame等),第一個用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
分組獲得兩列或更多列結果?
答案(使用list()
來收集幾個所需的摘要統計信息)存在於?data.table
幫助文件的優秀示例部分中。 (距離底部大約20行)。
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
編輯:
在下面的評論中,Matthew Dowle描述了一種清理代碼的簡單方法,其中x[i,j,by]
等調用中的j
參數變得越來越長。
在上面的電話中實施他的建議,你可以改為:
## 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))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.