Скользящее окно по годам и количество значений столбцов в R - PullRequest
0 голосов
/ 27 апреля 2020

Попытка создания скользящих оконных сумм на основе лет , значения et c среза моей таблицы данных

 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")

Я хочу вычислить сумму для каждого ' значения ' в данном году на основе столбца ' yearcount ' за 3 предыдущих года, как показано в ' sum-ycount ' Кроме того, Я также хочу рассчитать ' годовой итог ' каждый ' год ' на основе суммы за 3 предыдущих года, как показано на рисунке: * 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

1 Ответ

1 голос
/ 27 апреля 2020

Это создает то, что, я полагаю, вы ищете, используя только 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)
}

output

> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...