【问题标题】:Longest run of changes for each dataframe in a list列表中每个数据帧的最长更改运行
【发布时间】:2019-02-18 15:27:55
【问题描述】:

我有一个包含多个数据框的列表,每个数据框都包含一串日期,对于每个日期,+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 处使用序列和 rle 找到了以下单个数据帧

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

但我正在努力将其输入 lapply 或 map 以使其遍历列表。

我不介意确切的输出,但理想情况下它包括: 数据框名称、当前连续记录、更长的上一个连续记录以及连续记录结束的日期。 但在最基本的情况下,只需将序列号作为新列添加到数据框上就会有很大帮助,我可以(尝试)从那里获取它。

【问题讨论】:

  • 试试lapply(clcn, function(x) sequence(rle(x$direction)$lengths))

标签: r list dataframe


【解决方案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)
    )
  )

【讨论】:

    【解决方案2】:

    这是一个使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 2021-11-12
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多