首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:过滤并在列中为数据帧中的数百行添加重复的相同值。

R:过滤并在列中为数据帧中的数百行添加重复的相同值。
EN

Stack Overflow用户
提问于 2022-04-03 08:05:54
回答 1查看 43关注 0票数 0

发行:

我有一个具有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之类的包来解决这个难题,到目前为止,我一直未能找到解决方案。

有人能帮忙吗?

在此之前,非常感谢您。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-03 12:50:01

如前所述,为这样的事情编写示例数据是很有帮助的。在这里,我创建了2个data.frames。一个将有您的数据(16k行),第二个将有您的筛选标准(例如,您希望保留的课程和日期范围)。

代码语言:javascript
复制
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,其中:

  • 课程为2,日期为1/1/16至12/1/16
  • 课程为3,日期为5/9/17至9/9/18

一旦您有了它,您可以尝试使用fuzzyjoin包来合并这两者,使用fuzzy_semi_join。它将在第一数据帧中保留与第二数据帧中的条件相匹配的行。

代码语言:javascript
复制
library(fuzzyjoin)

fuzzy_semi_join(
  df1,
  df2,
  by = c("course", "date" = "start_date", "date" = "end_date"),
  match_fun = c(`==`, `>=`, `<=`)
)

输出

代码语言:javascript
复制
  ID       date course
3  3 2016-08-28      2
6  6 2017-08-23      3

在这种情况下,只有两行符合这些标准。

作为替代,您可以使用data.table包进行合并。这可能是一个更快的解决方案。它应该会给你同样的结果。

代码语言:javascript
复制
library(data.table)

setDT(df1)
setDT(df2)

df1[df2, .(ID, x.date, course), on = .(course, date >= start_date, date <= end_date)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71724078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档