Что представляет собой функция R для обнаружения последовательных различий в кадре данных? - PullRequest
0 голосов
/ 07 мая 2020

Я использую следующий код в R, и он работает очень хорошо. Точнее, я каждый раз сравниваю cluster_id с последним cluster_ref , чтобы увидеть, когда они различаются на 2 периода подряд (данные организованы по fund_numbers). Однако хотелось бы адаптировать его к 5 периодам. Но заставить его работать невозможно. Вы знаете, как я могу изменить этот код, чтобы решить мою проблему?

get_output <- function(mon, ref){

  exp <- !is.na(Cluster_id) & !map2_lgl(Cluster_id, last(Cluster_ref), identical)

  as.integer(exp & lag(exp, default = FALSE))

}


df %>%

  arrange(Fund_number, rolling_window) %>% 

  group_by(Fund_number) %>% 

  mutate(Deviation = get_output(Cluster_id, Cluster_ref)) %>% 

  ungroup() 
rolling_window   Fund_number   Cluster_id   Cluster_ref   Expected_output
1                1             10           10            0
2                1             10           10            0
3                1             8            9             0
4                1             8            8             0
5                1             7            7             0
6                1             8            8             0
7                1             8            NA            1
8                1             7            NA            1
9                1             7            10            1
10               1             10           10            0
1                2             NA           NA            0
2                2             NA           3             0
3                2             3            3             0
4                2             2            5             0
5                2             2            NA            0
6                2             2            4             0
7                2             2            4             1
8                2             5            5             0
9                2             4            5             0
10               2             3            5             0

Это то, что я хочу. Как видите, данные организованы по номеру фонда. Затем я смотрю на последний cluster_ref для каждого фонда (то есть каждые 8 ​​строк) и сравниваю его с каждым cluster_id для каждого фонда. Как только он отличается по крайней мере 5 периодов подряд, у меня будет 1, если не 0. Итак, для каждого фонда я сравниваю 8-й cluster_ref и cluster_id строк с 1 по 8.

Код выше делает это но с 2 временными интервалами.

Большое спасибо,

Ван ie

1 Ответ

1 голос
/ 07 мая 2020

В data.table мы можем использовать rleid вместо Cluster_id значений.

library(data.table)

setDT(df)[, temp := rleid(last(Cluster_ref) != Cluster_id), Fund_number]
df[, output := +(seq_along(Cluster_ref) >= 5), .(Fund_number, temp)]
df[, temp := NULL]
df
#    rolling_window Fund_number Cluster_id Cluster_ref Expected_output output
# 1:              1           1         10          10               0      0
# 2:              2           1         10          10               0      0
# 3:              3           1          8           9               0      0
# 4:              4           1          8           8               0      0
# 5:              5           1          7           7               0      0
# 6:              6           1          8           8               0      0
# 7:              7           1          8          NA               1      1
# 8:              8           1          7          NA               1      1
# 9:              9           1          7          10               1      1
#10:             10           1         10          10               0      0
#11:              1           2         NA          NA               0      0
#12:              2           2         NA           3               0      0
#13:              3           2          3           3               0      0
#14:              4           2          2           5               0      0
#15:              5           2          2          NA               0      0
#16:              6           2          2           4               0      0
#17:              7           2          2           4               1      1
#18:              8           2          5           5               0      0
#19:              9           2          4           5               0      0
#20:             10           2          3           5               0      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...