r - 跨多个顺序因素的数据表分组

标签 r data.table

我正在尝试估计 data.tablen 个因素的一些参数.虽然我熟悉使用 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/

相关文章:

r - 当轴属于 'date' 类时使用 ggplot2 进行注释

R - 获取 RasterLayer 的特定波段

从 r 中条件句的输出中删除引号

r - dplyr 和非标准评估 (NSE)

r - 0.5 显示为 0.5 即使我使用 round(0.5,2)

performance - 如何使用 data.table 提高当前使用 ddply 的数据清理代码的性能?

r - 数据表按组滚动连接

r - 使用 rollends 滚动连接参数的 data.table 混淆

r - 确定重叠范围 - R

r - 添加具有 NA 值的行