#r #dplyr
Вопрос:
У меня есть следующая таблица :
Дата | Ценности | Дни |
---|---|---|
12/28/2020 | 0.485002 | 0 |
12/29/2020 | 0.385427 | 1 |
12/30/2020 | 0.323091 | 2 |
12/31/2020 | 0.19967 | 3 |
1/4/2021 | 0.009859 | 4 |
1/5/2021 | -0.15653 | 0 |
1/6/2021 | -0.26286 | 1 |
1/7/2021 | -0.18659 | 2 |
1/8/2021 | -0.18207 | 3 |
1/22/2021 | 1.077845 | 0 |
1/25/2021 | 1.300135 | 1 |
1/26/2021 | 1.390824 | 2 |
1/27/2021 | 1.256247 | 3 |
1/28/2021 | 1.09526 | 4 |
В столбце «Дни» отображается количество дней с момента последнего переключения знака «Значения» с положительного на отрицательное и наоборот.
Как я могу создать столбец «Дни», используя «dplyr мутировать» в R ?
Спасибо.
Ответ №1:
Мы можем использовать rleid
data.table
пакет для создания переменной группировки, а затем создать количество дней.
library(dplyr) library(data.table) dat2 lt;- dat %gt;% mutate(G = rleid(Values gt; 0)) %gt;% group_by(G) %gt;% mutate(Days = 0:(n() - 1)) %gt;% ungroup() %gt;% select(-G) dat2 # # A tibble: 14 x 3 # Date Values Days # lt;chrgt; lt;dblgt; lt;intgt; # 1 12/28/2020 0.485 0 # 2 12/29/2020 0.385 1 # 3 12/30/2020 0.323 2 # 4 12/31/2020 0.200 3 # 5 1/4/2021 0.00986 4 # 6 1/5/2021 -0.157 0 # 7 1/6/2021 -0.263 1 # 8 1/7/2021 -0.187 2 # 9 1/8/2021 -0.182 3 # 10 1/22/2021 1.08 0 # 11 1/25/2021 1.30 1 # 12 1/26/2021 1.39 2 # 13 1/27/2021 1.26 3 # 14 1/28/2021 1.10 4
Данные
dat lt;- read.table(text = "Date Values '12/28/2020' 0.485002 '12/29/2020' 0.385427 '12/30/2020' 0.323091 '12/31/2020' 0.19967 '1/4/2021' 0.009859 '1/5/2021' -0.15653 '1/6/2021' -0.26286 '1/7/2021' -0.18659 '1/8/2021' -0.18207 '1/22/2021' 1.077845 '1/25/2021' 1.300135 '1/26/2021' 1.390824 '1/27/2021' 1.256247 '1/28/2021' 1.09526", header = TRUE)
Комментарии:
1. Спасибо за такое короткое и умное решение.
Ответ №2:
Если использовать и dplyr
то и другое и data.table
разрешено,
Данные
df lt;- read.table(text = "Date Values Days 12/28/2020 0.485002 0 12/29/2020 0.385427 1 12/30/2020 0.323091 2 12/31/2020 0.19967 3 1/4/2021 0.009859 4 1/5/2021 -0.15653 0 1/6/2021 -0.26286 1 1/7/2021 -0.18659 2 1/8/2021 -0.18207 3 1/22/2021 1.077845 0 1/25/2021 1.300135 1 1/26/2021 1.390824 2 1/27/2021 1.256247 3 1/28/2021 1.09526 4", header = T)
Код
library(data.table) library(dplyr) df %gt;% select(-Days) %gt;% # This line may not needed if Days is not at your data at the beginning mutate(key = sign(Values) == sign(lag(Values)), key = ifelse(!key | is.na(key), 0, 1)) %gt;% data.table() %gt;% .[,Days := cumsum(key), by = rleid(key)] %gt;% select(-key) Date Values days 1: 12/28/2020 0.485002 0 2: 12/29/2020 0.385427 1 3: 12/30/2020 0.323091 2 4: 12/31/2020 0.199670 3 5: 1/4/2021 0.009859 4 6: 1/5/2021 -0.156530 0 7: 1/6/2021 -0.262860 1 8: 1/7/2021 -0.186590 2 9: 1/8/2021 -0.182070 3 10: 1/22/2021 1.077845 0 11: 1/25/2021 1.300135 1 12: 1/26/2021 1.390824 2 13: 1/27/2021 1.256247 3 14: 1/28/2021 1.095260 4
Комментарии:
1. Спасибо за ваше решение.