Самый длинный прогон изменений для каждого фрейма данных в списке - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть список из нескольких фреймов данных, каждый из которых содержит строку дат и для каждой даты либо +1, чтобы указать увеличение, либо -1, чтобы уменьшить.

Вот пример

security1 <- data.frame(
    date = seq(from =as.Date('2019-01-01'), to = as.Date('2019-01-10'), by = 'day'),
    direction = c(1, 1, 1, -1, -1, 1, 1, 1, 1, -1))
security2 <- data.frame(
    date = seq(from =as.Date('2019-01-01'), to = as.Date('2019-01-10'), by = 'day'),
    direction = c(1, -1, 1, -1, -1, 1, 1,- 1, 1, -1))
clcn <- list(Sec1 = security1, Sec2 = security2)

Для каждого кадра данных я пытаюсь найти длину самой последней строки изменений, и в прошлый раз число было больше, чем это.Может случиться так, что текущая полоса составляет всего 1 день, если движение предыдущего дня было в другом направлении.

Я искал ответ на этот вопрос в течение нескольких дней и нашел следующее, используя sequence и rle для одного кадра данных в Вычислить переменную подсчета в кадре данных

sequence(rle(as.character(data$list))$lengths)

Но я изо всех сил пытаюсь вставить это в lapply или map, чтобы заставить его повторяться по списку.

Я не возражаю против точного вывода, но в идеале это должно включать: имя Dataframe, текущую серию, предыдущийдлинная полоса, и свидание закончилось.Но, по большому счету, простое добавление порядкового номера в качестве нового столбца на фрейме данных было бы огромной помощью, и я могу (попытаться) взять его оттуда.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Здесь можно использовать base R с lapply и transform

lapply(clcn, transform, streak = sequence(rle(direction)$lengths))
#$Sec1
#         date direction streak
#1  2019-01-01         1      1
#2  2019-01-02         1      2
#3  2019-01-03         1      3
#4  2019-01-04        -1      1
#5  2019-01-05        -1      2
#6  2019-01-06         1      1
#7  2019-01-07         1      2
#8  2019-01-08         1      3
#9  2019-01-09         1      4
#10 2019-01-10        -1      1

#$Sec2
#         date direction streak
#1  2019-01-01         1      1
#2  2019-01-02        -1      1
#3  2019-01-03         1      1
#4  2019-01-04        -1      1
#5  2019-01-05        -1      2
#6  2019-01-06         1      1
#7  2019-01-07         1      2
#8  2019-01-08        -1      1
#9  2019-01-09         1      1
#10 2019-01-10        -1      1
0 голосов
/ 18 февраля 2019

@ akrun имеет правильную идею, но поскольку вы сказали, что добавили в data.frame, возможно:

library(tidyverse)

clcn %>%
  map(~ mutate(., streak = sequence(rle(direction)$lengths)))

$`Sec1`
         date direction streak
1  2019-01-01         1      1
2  2019-01-02         1      2
3  2019-01-03         1      3
4  2019-01-04        -1      1
5  2019-01-05        -1      2
6  2019-01-06         1      1
7  2019-01-07         1      2
8  2019-01-08         1      3
9  2019-01-09         1      4
10 2019-01-10        -1      1

$Sec2
         date direction streak
1  2019-01-01         1      1
2  2019-01-02        -1      1
3  2019-01-03         1      1
4  2019-01-04        -1      1
5  2019-01-05        -1      2
6  2019-01-06         1      1
7  2019-01-07         1      2
8  2019-01-08        -1      1
9  2019-01-09         1      1
10 2019-01-10        -1      1

Оттуда вы можете сделать больше mutate вызовов / дополнений, таких как:

clcn %>%
  map(
    ~ mutate(
      ., 
      streak = sequence(rle(direction)$lengths), 
      max_streak = streak == max(streak)
    )
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...