【问题标题】:Index based on dates基于日期的索引
【发布时间】:2021-12-28 03:18:33
【问题描述】:

我有一个看起来像这样的表:

Date_Filed Form_Type
  <date>     <chr>    
1 2000-03-24 10-K     
2 2000-01-27 10-K     
3 2000-03-16 10-Q     
4 2000-03-21 10-K     
5 2000-03-21 10-K     
6 2000-03-21 10-K

我想添加这样的索引:

Date_Filed Form_Type Index
  <date>     <chr>   <Int>
1 2000-03-24 10-K     -3 
2 2000-01-27 10-K     -2
3 2000-03-16 10-Q     -1
4 2000-03-21 10-K      0
5 2000-03-21 10-K      1
6 2000-03-21 10-K      3

问题是我给出函数的任何日期的索引都应该为 0,未来日期的索引为正,过去的日期为负(其中 0 是现在)。数据框中的行数可能不同。有没有人对此有好的解决方案?

tidyverse / dplyr 解决方案更可取。

提前谢谢你!

【问题讨论】:

  • 为什么第5行和第6行的索引从1跳到3?
  • 您的示例似乎与您陈述的问题不符。第 4-6 行的日期均为 3 月 21 日,但具有升序索引。第 1-3 行似乎是随机排序的。有什么保证“过去”日期不会滑入“未来”部分?

标签: r indexing dplyr


【解决方案1】:

下面我定义了一个函数rank_date。这是你想要的?请注意,我更改了示例数据以更好地反映您描述的问题。此外,您需要考虑如何处理关系。您可以按照?rank 中的说明指定ties.method

dat <- data.frame(Date_Filed = as.Date(c("2000-03-24",
                                  "2000-01-27",
                                  "2000-03-16",
                                  "2000-03-21",
                                  "2000-03-22",
                                  "2000-03-23")),
           `Form_Type` = c("10-K", "10-K", "10-Q", "10-K", "10-K", "10-K")
)
 

rank_date <- function(x, anker, ties.method = "average") {
  diff <- as.numeric(x - as.Date(anker))
  ini_rank <- rank(diff, ties.method = ties.method)
  ref <- ini_rank[x == anker][1]
  out_rank <- ini_rank - ref
  out_rank
}

library(dplyr)

dat %>% 
  mutate(Index = rank_date(Date_Filed, "2000-03-21"))

#>   Date_Filed Form_Type Index
#> 1 2000-03-24      10-K     3
#> 2 2000-01-27      10-K    -2
#> 3 2000-03-16      10-Q    -1
#> 4 2000-03-21      10-K     0
#> 5 2000-03-22      10-K     1
#> 6 2000-03-23      10-K     2

reprex package (v0.3.0) 于 2021 年 12 月 28 日创建

【讨论】:

  • 谢谢!这可能是一个解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多