gpt4 book ai didi

r - R中的组内操作(不是滚动总和)

转载 作者:行者123 更新时间:2023-12-04 00:00:41 26 4
gpt4 key购买 nike

我有一个由学生 (id) 和他们每年的年级组成的数据集:

library(data.table)
set.seed(1)
students <- data.table("id" = rep(1:10, each = 10),
"year" = rep(2000:2009, 10),
"grade" = sample(c(9:11, rep(NA, 5)), 100, replace = T))

这是学生 1 的示例:

     id year grade
1: 1 2000 9
2: 1 2001 NA
3: 1 2002 NA
4: 1 2003 9
5: 1 2004 10
6: 1 2005 NA
7: 1 2006 NA
8: 1 2007 11
9: 1 2008 NA

我希望有一种方法可以访问每个学生以前和将来的成绩以执行不同的操作。以example为例,添加学生的最后三个成绩。这将产生一个像这样的数据集:

    id year grade sum_lag_3
1: 1 2000 9 9 # 1st window, size 1: 9
2: 1 2001 NA 9
3: 1 2002 NA 9
4: 1 2003 9 18 # 2nd, size 2: 9 + 9 = 18
5: 1 2004 10 28 # 3rd, size 3: 9 + 9 + 10 = 28
6: 1 2005 NA 28
7: 1 2006 NA 28
8: 1 2007 11 30 # 4th, size 3: 9 + 10 + 11 = 30
9: 1 2008 NA 30
10: 1 2009 10 31 # 5th, size 3: 10 + 11 + 10 = 31

11: 2 2001 11 11 # 1st window, size 1: 11

(所有结果都类似于 this )。

  • 然而,这不是关于执行滚动总和的帖子。
  • 我希望能够更普遍地在每个小组中执行操作,为此我需要找到一种方法来引用所有学生过去和 future 的成绩。

所以在第一行的情况下,由于没有先前的观察,这意味着“过去”向量是空的,但“ future ”向量将是 NA NA 9 10 NA NA 11 NA 10

同样,对于第二行,“过去”向量将是 9,“ future ”向量将是:

NA 9 10 NA NA 11 NA 10

对于第三行,“过去”向量为 9 NA,“ future ”向量为:

9 10 NA NA 11 NA 10

这是我想引用以进行不同计算的信息。仅在每个组内的计算,并因上下文而异。最好我想使用 data.table 来做到这一点,而不是将我的数据重新整形为宽格式。

我尝试过以下操作:

students[, .SD[, sum_last_3:= ...], by = id]

但我收到一条错误消息,指出此功能在 data.table 上尚不可用(其中 ... 是任何操作的占位符。)。

谢谢大家。


最佳答案

类似于@chinsoon12,但使用 zoo::rollapply 可以轻松地将 sum 应用于部分窗口。

d[!is.na(grade), rs := rollapply(grade, 3, sum, align = "right", partial = TRUE), by = id]
d[ , rs := nafill(rs, type = "locf"), by = id]

# id year grade sum_lag_3 rs
# 1: 1 2000 9 9 9
# 2: 1 2001 NA 9 9
# 3: 1 2002 NA 9 9
# 4: 1 2003 9 18 18
# 5: 1 2004 10 28 28
# 6: 1 2005 NA 28 28
# 7: 1 2006 NA 28 28
# 8: 1 2007 11 30 30
# 9: 1 2008 NA 30 30
# 10: 1 2009 10 31 31
# 11: 2 2001 11 11 11

data.table::frollsum 中,“partial 窗口功能不受支持,虽然可以通过使用 adaptive=TRUE",以及一个自适应滚动函数(参见 ?frollsum):

arf = function(n, len) if(len < n) seq.int(len) else c(seq.int(n), rep(n, len - n))
# if no 'grade' is shorter than n (the full window width), you only need:
# c(seq.int(n), rep(n, len - n))

d[!is.na(grade) , rs2 := frollsum(grade, n = arf(3, .N), align = "right", adaptive = TRUE),
by = id]
d[ , rs2 := nafill(rs, type = "locf"), by = id]

# id year grade sum_lag_3 rs rs2
# 1: 1 2000 9 9 9 9
# 2: 1 2001 NA 9 9 9
# 3: 1 2002 NA 9 9 9
# 4: 1 2003 9 18 18 18
# 5: 1 2004 10 28 28 28
# 6: 1 2005 NA 28 28 28
# 7: 1 2006 NA 28 28 28
# 8: 1 2007 11 30 30 30
# 9: 1 2008 NA 30 30 30
# 10: 1 2009 10 31 31 31
# 11: 2 2001 11 11 11 11

关于 your comment 的注释:

I want to be able to preform operations utilizing the past and future of a student for all kinds of operations not just a sum

zoo::rollapply 中,您可以将其他函数放在 FUN 参数中。目前,data.table 等效项 frollapply 没有 adaptive 参数。因此,我上面用于 frollsum 的方法还不能应用在 frollapply 中。

关于r - R中的组内操作(不是滚动总和),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62417520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com