查看以前日期的 R 函数

R function that looks through previous dates

我有一些具有名称、日期和排名的每周数据切片。

我想创建一个新列来标记它们在前两个时期中始终排名第 2 或更高的情况。

  name<-  c("a","a","a","a",
         "b","b","b","b",
         "c","c","c","c")     
  date<-  c("2015-01-19","2014-01-12","2014-01-05","2014-01-01",
            "2015-01-19","2014-01-12","2014-01-05","2014-01-01",
            "2015-01-19","2014-01-12","2014-01-05","2014-01-01")
  rank<-  c(1,2,1,3,
            2,3,2,1,
            3,1,3,2)
  df<-data.frame(name,date,rank)
  df<-arrange(df,date,desc(rank))
  df
    name       date rank
     a 2014-01-01    3
     c 2014-01-01    2
     b 2014-01-01    1
     c 2014-01-05    3
     b 2014-01-05    2
     a 2014-01-05    1
     b 2014-01-12    3
     a 2014-01-12    2
     c 2014-01-12    1
     c 2015-01-19    3
     b 2015-01-19    2
     a 2015-01-19    1

例如: 对于 1 月 19 日的 a,它排名 1,并且在 1 月 12 日和 1 月 5 日的排名也低于 2,所以用 1 标记 对于 1 月 19 日的 b,它排在第 2 位,但它在之前的两个日期都排在第 2 位,因此标记为 0。 对于1月19日的c,它的排名不低于2,所以用0标记。

这是我希望看到的输出:

name  date  rank    consistent
    a   1/1/2014    3   NA
    c   1/1/2014    2   NA
    b   1/1/2014    1   NA
    c   1/5/2014    3   NA
    b   1/5/2014    2   NA
    a   1/5/2014    1   NA
    b   1/12/2014   3   0
    a   1/12/2014   2   0
    c   1/12/2014   1   0
    c   1/19/2015   3   0
    b   1/19/2015   2   0
    a   1/19/2015   1   1

非常感谢!

我有一个基于data.table的解决方案:

library(data.table)
setDT(d)[,consistent:=rank < 3 & c(NA,rank[-.N])<3 & c(NA,NA,rank[-c(.N-1,.N)])<3,name]
d
#     name       date rank consistent
#  1:    a 2014-01-01    3      FALSE
#  2:    c 2014-01-01    2         NA
#  3:    b 2014-01-01    1         NA
#  4:    c 2014-01-05    3      FALSE
#  5:    b 2014-01-05    2         NA
#  6:    a 2014-01-05    1      FALSE
#  7:    b 2014-01-12    3      FALSE
#  8:    a 2014-01-12    2      FALSE
#  9:    c 2014-01-12    1      FALSE
# 10:    c 2015-01-19    3      FALSE
# 11:    b 2015-01-19    2      FALSE
# 12:    a 2015-01-19    1       TRUE

它不会像示例输出中那样生成 consistent 列,而是使作业标记请求的行。

更新

这是更新后的解决方案,它产生的输出与 OP 问题中的一致:

setDT(d)[,consistent:=rowSums(cbind(rank < 3, c(NA,rank[-.N])<3, c(NA,NA,rank[-c(.N-1,.N)])<3)) %/%3 ,name]

print(d)
#     name       date rank consistent
#  1:    a 2014-01-01    3         NA
#  2:    c 2014-01-01    2         NA
#  3:    b 2014-01-01    1         NA
#  4:    c 2014-01-05    3         NA
#  5:    b 2014-01-05    2         NA
#  6:    a 2014-01-05    1         NA
#  7:    b 2014-01-12    3          0
#  8:    a 2014-01-12    2          0
#  9:    c 2014-01-12    1          0
# 10:    c 2015-01-19    3          0
# 11:    b 2015-01-19    2          0
# 12:    a 2015-01-19    1          1

你的问题不是很清楚,但也许你需要这样的东西?:

library(ggplot2)
library(dplyr)

df %>% group_by(name) %>% mutate(consistent = rank > lag(rank, 1) & rank > lag(rank, 2))
Source: local data frame [12 x 4]
Groups: name

   name       date rank consistent
1     a 2014-01-01    3         NA
2     c 2014-01-01    2         NA
3     b 2014-01-01    1         NA
4     c 2014-01-05    3         NA
5     b 2014-01-05    2      FALSE
6     a 2014-01-05    1      FALSE
7     b 2014-01-12    3       TRUE
8     a 2014-01-12    2      FALSE
9     c 2014-01-12    1      FALSE
10    c 2015-01-19    3       TRUE
11    b 2015-01-19    2      FALSE
12    a 2015-01-19    1      FALSE