【问题标题】:Years based rolling window and count of column value in R基于年份的滚动窗口和 R 中的列值计数
【发布时间】:2020-08-10 23:17:37
【问题描述】:

尝试根据我的数据表的 yearsvalue 等切片创建滚动窗口总和

 dt <- structure(list(row = c("2481", "1153", "1898", "2090", "2423", 
"568", "1275", "839", "421", "478", "1270", "2449", "1059", "2449", 
"1686", "1620", "633", "684", "1686", "684", "1816", "2129", 
"2262", "2129", "1412", "2149", "204", "792", "935", "1151", 
"1855", "1816", "605", "1842", "2588", "76", "337", "515", "1764", 
"1815", "1710", "203", "1360", "1456", "1239", "962", "1296", 
"1851", "1978", "1978"), year = c(1984, 1985, 1986, 1986, 1986, 
1987, 1987, 1988, 1989, 1989, 1994, 1994, 1994, 1994, 1994, 1994, 
1994, 1994, 1994, 1994, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
1995, 1995, 1995, 1995, 1995, 1996, 1996, 1996, 1996, 1996, 1996, 
1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 
1996), variable = c("X1", "X1", "X1", "X1", "X1", "X1", "X1", 
"X1", "X1", "X1", "X1", "X1", "X1", "X2", "X1", "X1", "X1", "X1", 
"X2", "X2", "X1", "X1", "X1", "X2", "X1", "X1", "X1", "X1", "X1", 
"X1", "X1", "X2", "X1", "X1", "X1", "X1", "X1", "X1", "X1", "X1", 
"X1", "X1", "X1", "X1", "X1", "X1", "X1", "X1", "X1", "X2"), 
    value = c("Sh", "Sh", "Sh", "Sh", "Sh", "Sh", "SM", "Sh", 
    "Sh", "SM", "Ap", "De", "El", "El", "Ga", "Ic", "SA", "St", 
    "St", "Th", "Au", "Bi", "El", "El", "Pe", "SA", "St", "St", 
    "St", "St", "St", "St", "Ap", "Ap", "Ap", "Au", "Ca", "Ca", 
    "Ca", "Ca", "Co", "El", "El", "El", "ES", "Ic", "Ic", "Ic", 
    "MC", "Mi"), valueCount = c(8L, 8L, 8L, 8L, 8L, 8L, 2L, 8L, 
    8L, 2L, 4L, 1L, 7L, 7L, 1L, 4L, 2L, 8L, 8L, 1L, 2L, 1L, 7L, 
    7L, 1L, 2L, 8L, 8L, 8L, 8L, 8L, 8L, 4L, 4L, 4L, 2L, 4L, 4L, 
    4L, 4L, 1L, 7L, 7L, 7L, 1L, 4L, 4L, 4L, 1L, 1L), yearlycount = c(1L, 
    1L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 
    1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 6L, 6L, 6L, 6L, 6L, 
    6L, 3L, 3L, 3L, 1L, 4L, 4L, 4L, 4L, 1L, 3L, 3L, 3L, 1L, 3L, 
    3L, 3L, 1L, 1L), yeartotal = c(1L, 1L, 3L, 3L, 3L, 2L, 2L, 
    1L, 2L, 2L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
    10L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
    12L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 
    18L, 18L, 18L, 18L, 18L, 18L, 18L)), row.names = c(NA, -50L
), .Names = c("row", "year", "variable", "value", "valueCount", 
"yearlycount", "yeartotal"), class = "data.frame")

我想根据前 3 年的“yearlycount”列计算给定年份中每个“value”的总和,如“sum-ycount' 此外,我还想根据前 3 年的总和计算每个“yeartotal”,如“sum-ytotal”所示'

year    value   sum-ycount  sum-ytotal
1987    Sh  5   5
1987    SM  0   0
1988    Sh  5   6
1989    Sh  5   6
1989    SM  1   2
1994    Ap  0   0

【问题讨论】:

  • 您的dput 好像被切断了。
  • 我想我在复制时漏掉了一行,谢谢 编辑我的数据框
  • 太好了,我编辑了我的答案。我相信它可以解决您的问题,如果我误解了,请告诉我。

标签: r sum conditional-statements rolling-computation


【解决方案1】:

这创建了我相信您只使用 Base-R 寻找的东西。

t$sumycount <- NA
dt$sumytotal <- NA
span <- 3

for(i in 1:nrow(dt)){
  val <- dt$value[i]
  yr <- dt$year[i]

  slice <- do.call(rbind,lapply(1:span, function(x) head(dt[with(dt,year==yr-x) & with(dt,value==val),],n=1)))
  dt$sumycount[i] <- sum(slice$yearlycount)
  dt$sumytotal[i] <- sum(slice$yeartotal)
}

输出

> dt
    row year variable value valueCount yearlycount yeartotal sumycount sumytotal
1  2481 1984       X1    Sh          8           1         1         0         0
2  1153 1985       X1    Sh          8           1         1         1         1
3  1898 1986       X1    Sh          8           3         3         2         2
4  2090 1986       X1    Sh          8           3         3         2         2
5  2423 1986       X1    Sh          8           3         3         2         2
6   568 1987       X1    Sh          8           1         2         5         5
7  1275 1987       X1    SM          2           1         2         0         0
8   839 1988       X1    Sh          8           1         1         5         6
9   421 1989       X1    Sh          8           1         2         5         6
10  478 1989       X1    SM          2           1         2         1         2
11 1270 1994       X1    Ap          4           1        10         0         0
12 2449 1994       X1    De          1           1        10         0         0
13 1059 1994       X1    El          7           2        10         0         0
14 2449 1994       X2    El          7           2        10         0         0
15 1686 1994       X1    Ga          1           1        10         0         0
16 1620 1994       X1    Ic          4           1        10         0         0
17  633 1994       X1    SA          2           1        10         0         0
18  684 1994       X1    St          8           2        10         0         0
19 1686 1994       X2    St          8           2        10         0         0
20  684 1994       X2    Th          1           1        10         0         0
21 1816 1995       X1    Au          2           1        12         0         0
22 2129 1995       X1    Bi          1           1        12         0         0
23 2262 1995       X1    El          7           2        12         2        10
24 2129 1995       X2    El          7           2        12         2        10
25 1412 1995       X1    Pe          1           1        12         0         0
26 2149 1995       X1    SA          2           1        12         1        10
27  204 1995       X1    St          8           6        12         2        10
28  792 1995       X1    St          8           6        12         2        10
29  935 1995       X1    St          8           6        12         2        10
30 1151 1995       X1    St          8           6        12         2        10
31 1855 1995       X1    St          8           6        12         2        10
32 1816 1995       X2    St          8           6        12         2        10
33  605 1996       X1    Ap          4           3        18         1        10
34 1842 1996       X1    Ap          4           3        18         1        10
35 2588 1996       X1    Ap          4           3        18         1        10
36   76 1996       X1    Au          2           1        18         1        12
37  337 1996       X1    Ca          4           4        18         0         0
38  515 1996       X1    Ca          4           4        18         0         0
39 1764 1996       X1    Ca          4           4        18         0         0
40 1815 1996       X1    Ca          4           4        18         0         0
41 1710 1996       X1    Co          1           1        18         0         0
42  203 1996       X1    El          7           3        18         4        22
43 1360 1996       X1    El          7           3        18         4        22
44 1456 1996       X1    El          7           3        18         4        22
45 1239 1996       X1    ES          1           1        18         0         0
46  962 1996       X1    Ic          4           3        18         1        10
47 1296 1996       X1    Ic          4           3        18         1        10
48 1851 1996       X1    Ic          4           3        18         1        10
49 1978 1996       X1    MC          1           1        18         0         0
50 1978 1996       X2    Mi          1           1        18         0         0

【讨论】:

  • 是的,它确实输出了所需的内容,但是如果我想将我的窗口 3 更改为 4 或 5 年怎么办?它会改变整行是否可以创建窗口类型
  • 在 1987 年,Sh 的 sumycount 必须是唯一年份值,例如 1986+1985+1984,3+1+1 = 5 而不是 3+3+3+1+1=11
  • 已更改,我仍然不清楚您要查找的 sumYtotal 到底是什么。
  • sumycount 工作正常,但在 sumytotal 的情况下,我想对前 3 年的 yeartotal 求和,例如 1988 年的值 Sh = 6 (2+3+1) 1987+1986+1985
  • 我从昨天开始就在尝试弄清楚,但非常感谢您的时间和精力
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2016-11-19
  • 2021-08-31
  • 2021-09-26
  • 2019-03-18
相关资源
最近更新 更多