我在R magic query
中有一个数据框,其中一列为device id
,另一列为time
。时间格式为2013-05-02 09:20:12
dataframe
按升序排列。我正在尝试删除time
列(仅基于天数)大于上面一行的X天的所有行。
有没有办法应用这个?
答案 0 :(得分:1)
首先创建一个可重现的示例:
dates = seq(as.Date('2016-01-01'), as.Date('2016-07-01'), by = "days")
df <- data.frame(dateCol = sample(dates, 100))
然后,您可以创建一个计算列,该列采用上一个日期并为其添加4(或X天):
df$plusXdays = NA
df$plusXdays[2:nrow(df)] = df$dateCol[1:(nrow(df)-1)]
df$plusXdays = df$plusXdays + 4
然后您可以过滤您的专栏:
df = df[df$dateCol > df$plusXdays, ]
删掉计算专栏:
df$plusXdays = NULL
希望它有所帮助。
答案 1 :(得分:1)
# create data.frame
d <- data.frame(device_id=1:15,x.time= as.POSIXct(x = c( '01.01.2017 16:50:00', '03.01.2017 13:09:25',
'05.01.2017 0:23:55', '06.01.2017 12:17:55', '08.01.2017 5:10:16',
'09.01.2017 18:00:07', '11.01.2017 17:46:31', '13.01.2017 1:05:36',
'14.01.2017 20:00:39', '15.01.2017 22:42:36', '17.01.2017 3:05:08',
'18.01.2017 12:38:02', '20.01.2017 1:02:43', '21.01.2017 2:56:34',
'22.01.2017 14:55:48' ),format = "%d.%m.%Y %H:%M:%S"))
print(d)
X <- 1 # set days difference
library(dplyr)
d %>% tbl_df %>% mutate(x.dates=as.Date(x.time),prev.diff=x.dates-lag(x.dates)) %>% print %>% # calculate and view days between...
filter(prev.diff<=X) # select dates which have days between previos date <= X day
答案 2 :(得分:1)
试试这个:
subset(df,c(0,diff(as.Date(time))) <=X)
答案 3 :(得分:0)
你可以试试这个:
假设您的表格如下:
device_id <- c("A1", "A2", "A3", "A4")
date <- c("2001-01-01", "2001-01-01", "2001-01-02", "2001-01-03")
dat <- data.frame(device_id, date)
dat$date <- as.Date(dat$date)
您可以使用上一行中的日期创建一个附加列:
dat["date.previous"] <- as.Date(c(NA, head(dat["date"], dim(dat)[1] - 1)[[1]]))
然后创建一个辅助列以识别这两者之间的差异:
dat$date.diff <- dat$date - dat$date.previous
最后,你排除那些大于X天(在我的情况下为1)
的那些library("dplyr")
dat <- subset(dat, !date.diff >= 1)