R-筛选小于一组日期时间的日期时间
我有两个数据帧 一个是我的R-筛选小于一组日期时间的日期时间,r,datetime,dplyr,lubridate,R,Datetime,Dplyr,Lubridate,我有两个数据帧 一个是我的数据,其中我有几个变量列和几个与日期时间相关的列(datetimes、week#、dates、hour、minute、second),其中包含2017年每天的数据。比如说, > glimpse(data) Observations: 8,001,013 Variables: 12 $ id <chr> "(2, 3, 4)", "(5,)", "(6,)", "(7,)", "(8,)", "(9,)", "(10,)
数据
,其中我有几个变量列和几个与日期时间相关的列(datetimes、week#、dates、hour、minute、second),其中包含2017年每天的数据。比如说,
> glimpse(data)
Observations: 8,001,013
Variables: 12
$ id <chr> "(2, 3, 4)", "(5,)", "(6,)", "(7,)", "(8,)", "(9,)", "(10,)", "(11,)", "(12,)", "(13,)", "(14,)", "(15,)", "(16,)", "(17,)", "(18,)", "(19,)", "(20,)", "(21,...
$ x <int> 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1...
$ num <chr> "set([4225])", "set([4712])", "set([5271])", "set([5334])", "set([5395])", "set([5658])", "set([5889])", "set([6020])", "set([6063])", "set([6090])", "set([6...
$ w <int> 4, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 7, 1, 3, 2, 1, 1, 3, 2, 3, 2, 1, 1, 2, 1, 1, 4, 1, 2, 3, 1, 1, 1, 1, 3, 1, 1, 1, 2, 3, 1, 1, 4, 1, 2, 1...
$ z <int> 4, 6, -1, -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, -2, 2, 7, 1, -3, -2, 1, -1, 3, 2, 3, -2, -1, -1, -2, -1, -1, 4, 1, 2, -3, 1, 1, 1, 1, -3, 1, 1, 1...
$ datetime <dttm> 2017-02-19 18:00:00, 2017-02-19 18:00:00, 2017-02-19 18:00:00, 2017-02-19 18:00:00, 2017-02-19 18:00:00, 2017-02-19 18:00:01, 2017-02-19 18:00:01, 2017-02-1...
$ date <date> 2017-02-19, 2017-02-19, 2017-02-19, 2017-02-19, 2017-02-19, 2017-02-19, 2017-02-19, 2017-02-19, 2017-02-19, 2017-02-19, 2017-02-19, 2017-02-19, 2017-02-19, ...
$ day_of_week <ord> Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Sun, Su...
$ week <dbl> 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8...
$ hour <int> 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 1...
$ minute <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
$ second <dbl> 0.1187501, 0.3406179, 0.7030604, 0.7431633, 0.7939658, 1.0090485, 1.1624568, 1.2924566, 1.3619752, 1.3922081, 1.4920712, 1.5121725, 1.5621316, 1.6688271, 1.7...
我想在key\u datetimes
中标记每周到特定日期时间的数据。因此我想在data
中创建一个名为before\u key\u datetime
的新列,如果data$datetime
为FALSE,则为TRUE
我怎样才能做到这一点
换句话说,我想做的是只保留感兴趣的周数(这有效),然后我按周分组(这有效),然后为每个组添加标签/变异一个新列,说明第二个数据帧中哪些行在keyDateTime之前/之后(无法获取此部分)
我尝试过的事情:
- 在一个datetime上执行
ifelse
- 执行
vector-to-vector显然不是vector:ifelse
data%>%filter(周百分比在%lubridate::week(as.Date(key\u datetimes$keyDateTime)))%%>%group\u by(week)%%>%filter(datetime%在%c中(as.POSIXct(key\u datetimes$keyDateTime))
zoo::na.locf
在每个关键日期之前填写
library(dplyr)
library(zoo)
df %>%
full_join(key, by="Date") %>%
arrange(Date) %>%
mutate_at(vars(Code, key), funs(zoo::na.locf(., na.rm=FALSE, fromLast=TRUE)))
输出(头)
更简单的示例
simple <- head(df)
ans <- simple %>%
full_join(key, by="Date") %>%
arrange(Date)
处的mutate_将用向后移动的最近值填充所有NA
s。因此,第1-6行中的代码和键将采用第7行中的值
现在,您可以使用代码或键筛选您感兴趣的日期,或确定完整数据框中的日期是否早于键日期。比如说,
ans <- df %>%
full_join(key, by="Date") %>%
arrange(Date) %>%
mutate_at(vars(Code, key), funs(zoo::na.locf(., na.rm=FALSE, fromLast=TRUE)))
或
要确定数据框中的日期是否早于关键日期
ans[3, ]
# Date Code key
# 3 2017-01-04 00:00:01 1 TAIL1
告诉您数据框中的第三个条目在[1]键之前2017-01-12 08:30:00
以防万一
在每个关键日期后填写
df %>%
full_join(key, by="Date") %>%
arrange(Date) %>%
mutate_at(vars(Code, key), funs(zoo::na.locf(., na.rm=FALSE, fromLast=FALSE)))
输出(尾部)
资料
df我什么都不想填。我只是想知道一个日期时间是在另一个日期时间之前还是之后(即我的问题中的key\u datetime
)。您的答案似乎是在添加行。您可以使用上面的方法筛选在您的键之前的日期时间。我已经编辑了我的答案来说明这一点。问题是我不能按日期进行初始连接,因为这是第二级的日期时间,并且两个数据帧之间不一定有一个精确的连接。我还被
行的mutate\u弄糊涂了,这到底在做什么?请再看一次简单的示例。请注意,日期时间在simple
和key
中并不常见。即使两者不匹配,也可以保留两者的所有数据。
ans <- df %>%
full_join(key, by="Date") %>%
arrange(Date) %>%
mutate_at(vars(Code, key), funs(zoo::na.locf(., na.rm=FALSE, fromLast=TRUE)))
ans %>%
filter(Code==1)
# The last row is from your key data frame
ans %>%
filter(key=="TAIL1")
ans[3, ]
# Date Code key
# 3 2017-01-04 00:00:01 1 TAIL1
df %>%
full_join(key, by="Date") %>%
arrange(Date) %>%
mutate_at(vars(Code, key), funs(zoo::na.locf(., na.rm=FALSE, fromLast=FALSE)))
363 2017-12-21 00:00:01 9 TAIL9
364 2017-12-22 00:00:01 9 TAIL9
365 2017-12-23 00:00:01 9 TAIL9
366 2017-12-24 00:00:01 9 TAIL9
367 2017-12-25 00:00:01 9 TAIL9
368 2017-12-26 00:00:01 9 TAIL9
369 2017-12-27 00:00:01 9 TAIL9
370 2017-12-28 00:00:01 9 TAIL9
371 2017-12-29 00:00:01 9 TAIL9
372 2017-12-30 00:00:01 9 TAIL9
373 2017-12-31 00:00:01 9 TAIL9
374 2018-01-01 00:00:01 9 TAIL9
df <- data.frame(Date = ymd_hms("2017-01-01 00:00:01") + days(x=1:365))
key <- structure(list(Code = 1:9, key = c("TAIL1", "TAIL2", "TAIL3",
"TAIL4", "TAIL5", "TAIL6", "TAIL7", "TAIL8", "TAIL9"), Date = structure(c(1484209800,
1486640400, 1490171401, 1492079400, 1495182600, 1497342900, 1501234200,
1503469800, 1505287800), tzone = "UTC", class = c("POSIXct",
"POSIXt"))), class = "data.frame", .Names = c("Code", "key",
"Date"), row.names = c(NA, -9L))