gpt4 book ai didi

r - 在 data.table : how to get more than 1 column of results? 中分组

转载 作者:行者123 更新时间:2023-12-04 15:14:15 25 4
gpt4 key购买 nike

我有一个 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 s,第二个用 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 描述了一种清理代码的简单方法,其中 j调用中的参数,如 x[i,j,by]长的很尴尬。

在上面的电话中实现他的建议,您可以这样做:
## 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

关于r - 在 data.table : how to get more than 1 column of results? 中分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11233183/

25 4 0