Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-筛选小于一组日期时间的日期时间_R_Datetime_Dplyr_Lubridate - Fatal编程技术网

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
  • 执行
    ifelse
    vector-to-vector显然不是vector:
    data%>%filter(周百分比在%lubridate::week(as.Date(key\u datetimes$keyDateTime)))%%>%group\u by(week)%%>%filter(datetime%在%c中(as.POSIXct(key\u datetimes$keyDateTime))

不能100%确定这是您想要的,但请在将密钥与数据合并并按日期排列后尝试使用
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))