我有一个包含多个数据帧的列表,每个数据帧包含一串日期,对于每个日期,+ 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或映射中,以使其遍历列表。
我不介意确切的输出,但理想情况下,它将包括: 数据框名称,当前条纹,更长的以前条纹以及条纹结束的日期。 但是从最基本的角度来看,仅将序列号添加为数据帧上的新列将提供巨大的帮助,我可以(尝试)从那里获取它。
答案 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 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