我的数据类似于以下内容:
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
答案 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
,以及character
或zoo::yearmon
工作可能更容易factor
(很难修改)date
列