基于另一个因素,最接近但早于给定日期的日期

时间:2017-01-07 22:20:57

标签: r dplyr data-manipulation

我的数据类似于以下内容:

data.frame(date=c("2013-07","2013-08","2013-09","2013-11",
              "2013-11","2013-11","2014-02","2014-03"),
       X=c("0","1","0","0","1","0","1","0"))

  date    x 
1 2013-07 0 
2 2013-08 1
3 2013-09 0 
4 2013-11 0 
5 2013-11 1
6 2013-11 0
7 2014-02 1

我想创建一个新功能,显示不迟于当前日期但距当前日期最近的数据x = 1

date      x  lastdate
1 2013-07 0       NA
2 2013-08 1  2013-08
3 2013-09 0  2013-08
4 2013-11 0  2013-11
5 2013-11 1  2013-11
6 2013-11 0  2013-11
7 2014-02 1  2014-02
8 2014-03 0  2014-02

1 个答案:

答案 0 :(得分:1)

一个有效的解决方案可能是使用fintInterval并仅在x == "1"内搜索。我在开头添加了NA_character_,以了解findInterval返回零的情况(就像在第一行中一样)

一些方法论探索:

此处的基本想法是在NA的开头添加df$date[df$X == "1"],然后在原始df$date[df$X == "1"]向量内进行搜索。只要df$date中的值位于df$date[df$X == "1"]中的所有值之前,findInterval就会为其分配0。此零应该最终成为NA,因此我们将+1添加到findInterval找到的所有事件中,并在新向量(包含NA)内进行搜索。这样,所有0成为1 s,因此,它们被分配NA,因为NA是新向量中的第一个值。

df[["lastdate"]] <- c(NA_character_, 
                      as.character(df$date[df$X == "1"]))[findInterval(df$date, df$date[df$X == "1"]) + 1]
df
#      date X lastdate
# 1 2013-07 0     <NA>
# 2 2013-08 1  2013-08
# 3 2013-09 0  2013-08
# 4 2013-11 0  2013-11
# 5 2013-11 1  2013-11
# 6 2013-11 0  2013-11
# 7 2014-02 1  2014-02
# 8 2014-03 0  2014-02

或(这有一个dplyr标签)

library(dplyr)
df %>%
   mutate(lastdate = c(NA_character_, as.character(date[X == "1"]))[findInterval(date, date[X == "1"]) + 1])

作为旁注,使用numeric X而不是character,以及characterzoo::yearmon工作可能更容易factor(很难修改)date