我想计算一些摘要统计数据,并在数据表中按组执行不同的回归,并将结果以"宽"格式(即每组包含多列的一行).我可以通过多个步骤完成它,但似乎应该可以一次完成所有操作.
考虑这个示例数据:
set.seed=46984
dt <- data.table(ID=c(rep('Frank',5),rep('Tony',5),rep('Ed',5)), y=rnorm(15), x=rnorm(15), z=rnorm(15),key="ID")
dt
# ID y x z
# 1: Ed 0.2129400 -0.3024061 0.845335632
# 2: Ed 0.4850342 -0.5159197 -0.087965415
# 3: Ed 1.8917489 1.7803220 0.760465271
# 4: Ed -0.4330460 -2.1720944 0.973812545
# 5: Ed 0.7685060 0.7947470 1.279761200
# 6: Frank 0.4978475 -0.2906851 0.568101004
# 7: Frank 0.6323386 -0.5596599 1.537133025
# 8: Frank -0.8243218 -0.4354885 0.057818033
# 9: Frank 1.2402488 0.3229422 0.005995249
#10: Frank 0.2436210 -0.2651422 0.349532173
#11: Tony 0.4179568 0.1418463 …Run Code Online (Sandbox Code Playgroud) 我有一个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)
Run Code Online (Sandbox Code Playgroud)
我需要执行一些计算PERMNO,但在这个示例中,我们假设它们只有2:
mktcap <- a[ , tail(SHROUT,n=1)*tail(PRC,n=1),by=PERMNO]
sqret <- a[, sum(RET^2),by=PERMNO]
Run Code Online (Sandbox Code Playgroud)
哪个产生
> mktcap
PERMNO V1
[1,] 10006 8740.375
[2,] 10015 500.500
[3,] 20000 800.000
> …Run Code Online (Sandbox Code Playgroud) 重新发布到这篇文章,我创建了一个在data.table包上进行线性回归的例子,如下所示:
## rm(list=ls()) # anti-social
library(data.table)
set.seed(1011)
DT = data.table(group=c("b","b","b","a","a","a"),
v1=rnorm(6),v2=rnorm(6), y=rnorm(6))
setkey(DT, group)
ans <- DT[,as.list(coef(lm(y~v1+v2))), by = group]
Run Code Online (Sandbox Code Playgroud)
返回,
group (Intercept) v1 v2
1: a 1.374942 -2.151953 -1.355995
2: b -2.292529 3.029726 -9.894993
Run Code Online (Sandbox Code Playgroud)
我能够获得lm函数的系数.
我的问题是:
我们如何直接用于predict新的观察?如果我们有新的观察结果如下:
new <- data.table(group=c("b","b","b","a","a","a"),v1=rnorm(6),v2=rnorm(6))
Run Code Online (Sandbox Code Playgroud)
我试过了:
setkey(new, group)
DT[,predict(lm(y~v1+v2), new), by = group]
Run Code Online (Sandbox Code Playgroud)
但它给我带来了奇怪的答案:
group V1
1: a -2.525502
2: a 3.319445
3: a 4.340253
4: a 3.512047
5: a 2.928245
6: a 1.368679 …Run Code Online (Sandbox Code Playgroud) 我在为应该在这里问过的上一个问题做一个简单的扩展而感到困惑。
我正在尝试汇总(a)日期范围和(b)因素变量。样本数据可能是:
Brand Day Rev RVP
A 1 2535.00 195.00
B 1 1785.45 43.55
C 1 1730.87 32.66
A 2 920.00 230.00
B 2 248.22 48.99
C 3 16466.00 189.00
A 1 2535.00 195.00
B 3 1785.45 43.55
C 3 1730.87 32.66
A 4 920.00 230.00
B 5 248.22 48.99
C 4 16466.00 189.00
Run Code Online (Sandbox Code Playgroud)
感谢有用的建议,我找到了如何使用data.table查找几天内品牌的平均收入:
new_df<-df[,(mean(Rev)), by=list(Brand,Day)]
Run Code Online (Sandbox Code Playgroud)
现在,我想创建一个新表,其中有一个列,列出了每个品牌的按天按Rev的OLS回归得出的系数估算值。我尝试这样做,如下所示:
new_df2<-df[,(lm(Rev~Day)), by=list(Brand)]
Run Code Online (Sandbox Code Playgroud)
这似乎不太正确。有什么想法吗?我敢肯定,我已经错过了很明显的东西。