查看以前日期的 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
我有一些具有名称、日期和排名的每周数据切片。
我想创建一个新列来标记它们在前两个时期中始终排名第 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