我正在尝试估计 data.table
中 n 个因素的一些参数.虽然我熟悉使用 by
按因素执行操作的功能;对多个顺序因素执行此操作会导致一些问题。
举个简单的例子
df <- data.table(Group = c(rep("A", 2), rep("B", 3), rep("C", 2), rep("D", 4), "E", rep("F", 4)), Variable = round(rnorm(16), 2))
Group Variable
1: A 0.13
2: A 0.26
3: B -1.36
4: B -0.78
5: B -0.92
6: C 0.00
7: C -2.49
8: D -1.85
9: D 0.37
10: D -0.57
11: D 1.42
12: E -0.72
13: F -1.04
14: F 1.86
15: F 0.49
16: F 1.61
使用 df[, mean(Variable), by = Group]
会给出每个组的平均值。但是,我想计算前 n 个组的平均值。
我试过使用 M[, zoo::rollapply(Variable, n, mean), by = Group]
,但是,因为组的大小不同,使用固定的 n 将不起作用。
想要的是类似于 df[, mean(Variable), by = "This Group and previous n Groups]
的功能.
我试图实现的输出(对于 n = 3 的情况)看起来像
Group Variable
1: A NA
2: A NA
3: B NA
4: B NA
5: B NA
6: C 0.13
7: C 0.13
8: D -1.36
9: D -1.36
10: D -1.36
11: D -1.36
12: E 0
13: F -1.85
14: F -1.85
15: F -1.85
16: F -1.85
如有任何帮助,我们将不胜感激。
最佳答案
library(data.table)
library(RcppRoll)
df1 <- df[, .(n=.N, S=sum(Variable)), by = Group]
df1[, NewVariable:=roll_sum(S, 3, align="right", fill=NA)/roll_sum(n, 3, align="right", fill=NA),]
df[df1, on="Group"]
Group Variable n S NewVariable
1: A -0.63 2 -0.45 NA
2: A 0.18 2 -0.45 NA
3: B -0.84 3 1.09 NA
4: B 1.60 3 1.09 NA
5: B 0.33 3 1.09 NA
6: C -0.82 2 -0.33 0.04428571
7: C 0.49 2 -0.33 0.04428571
8: D 0.74 4 2.52 0.36444444
9: D 0.58 4 2.52 0.36444444
10: D -0.31 4 2.52 0.36444444
11: D 1.51 4 2.52 0.36444444
12: E 0.39 1 0.39 0.36857143
13: F -0.62 4 -1.75 0.12888889
14: F -2.21 4 -1.75 0.12888889
15: F 1.12 4 -1.75 0.12888889
16: F -0.04 4 -1.75 0.12888889
我希望我的解决方案是不言自明的。
dplyr
等价于
df %>%
group_by(Group) %>%
summarise(n=n(), S=sum(Variable)) %>%
mutate(NewVar=roll_sum(S, 3, align="right", fill=NA)/roll_sum(n, 3, align="right", fill=NA)) %>%
left_join(df, by="Group")
数据
set.seed(1)
df <- data.table(Group = c(rep("A", 2), rep("B", 3), rep("C", 2), rep("D", 4), "E", rep("F", 4)), Variable = round(rnorm(16), 2))
包裹信息
[1] RcppRoll_0.2.2 data.table_1.9.5
关于r - 跨多个顺序因素的数据表分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31902759/