列表中每个数据框的最长更改时间

时间:2019-02-18 15:27:56

标签: r list dataframe

我有一个包含多个数据帧的列表,每个数据帧包含一串日期,对于每个日期,+ 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天。

我已经搜寻了几天的答案,并使用序列和规则对Compute counting variable in dataframe上的单个数据帧找到了以下内容

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

但是我正努力将其输入lapply或映射中,以使其遍历列表。

我不介意确切的输出,但理想情况下,它将包括: 数据框名称,当前条纹,更长的以前条纹以及条纹结束的日期。 但是从最基本的角度来看,仅将序列号添加为数据帧上的新列将提供巨大的帮助,我可以(尝试)从那里获取它。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

以下是将base Rlapplytransform一起使用的选项

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