发行:
我有一个具有16000行的数据框架,我将使用这些数据在QGIS中绘制一条船航迹线。其中一列名为‘Course',这是船在每个田野季节出海的后续编号顺序。
例如,航向1从6/16/17到8/13/17不等。航迹数据框架包含ID、日期、时间、航向、纬度和经度的五列。每天每秒钟记录一次值,一般从早上6点到下午6点。因此,对于每一个领域的课程,有数百行。总共有11个课程,为期5年(2016-2018年)。
是否有任何方法可以按日期对每一行数据进行筛选,以输入一个重复数字,例如'2‘(课程2)值在'Course'列中的日期为8/14/17至10/16/17,以及10/17/17至03/01/18日期的重复值'3’(课程3)等等?
不幸的是,我无法共享我的数据,我也找不到任何与我的数据框架类似的数据,我可以使用函数dput()为这个问题提供数据。
我一直在使用诸如、dplyr、和tidyverse之类的包来解决这个难题,到目前为止,我一直未能找到解决方案。
有人能帮忙吗?
在此之前,非常感谢您。
发布于 2022-04-03 12:50:01
如前所述,为这样的事情编写示例数据是很有帮助的。在这里,我创建了2个data.frames。一个将有您的数据(16k行),第二个将有您的筛选标准(例如,您希望保留的课程和日期范围)。
df1 <- data.frame(
ID = 1:10,
date = seq.Date(as.Date("2016-01-01"), as.Date("2019-01-01"), by = 120),
course = rep(1:5, each = 2)
)
df1
ID date course
1 1 2016-01-01 1
2 2 2016-04-30 1
3 3 2016-08-28 2
4 4 2016-12-26 2
5 5 2017-04-25 3
6 6 2017-08-23 3
7 7 2017-12-21 4
8 8 2018-04-20 4
9 9 2018-08-18 5
10 10 2018-12-16 5
df2 <- data.frame(
course = c(2, 3),
start_date = as.Date(c("2016-01-01", "2017-05-09")),
end_date = as.Date(c("2016-12-01", "2018-09-09"))
)
df2
course start_date end_date
1 2 2016-01-01 2016-12-01
2 3 2017-05-09 2018-09-09他们没有所有的专栏,但希望这将给你的想法。
在我的示例中,我将过滤df1,其中:
。
一旦您有了它,您可以尝试使用fuzzyjoin包来合并这两者,使用fuzzy_semi_join。它将在第一数据帧中保留与第二数据帧中的条件相匹配的行。
library(fuzzyjoin)
fuzzy_semi_join(
df1,
df2,
by = c("course", "date" = "start_date", "date" = "end_date"),
match_fun = c(`==`, `>=`, `<=`)
)输出
ID date course
3 3 2016-08-28 2
6 6 2017-08-23 3在这种情况下,只有两行符合这些标准。
作为替代,您可以使用data.table包进行合并。这可能是一个更快的解决方案。它应该会给你同样的结果。
library(data.table)
setDT(df1)
setDT(df2)
df1[df2, .(ID, x.date, course), on = .(course, date >= start_date, date <= end_date)]https://stackoverflow.com/questions/71724078
复制相似问题