gpt4 book ai didi

r - 按范围过滤一个数据框的有效方法

转载 作者:行者123 更新时间:2023-12-03 21:36:51 25 4
gpt4 key购买 nike

假设我有一个数据框,其中包含一堆数据和一个日期/时间列,指示收集每个数据点的时间。我有另一个列出时间跨度的数据框,其中“开始”列表示每个跨度开始时的日期/时间,“结束”列表示每个跨度结束时的日期/时间。

我在下面使用简化数据创建了一个虚拟示例:

main_data = data.frame(Day=c(1:30))

spans_to_filter =
data.frame(Span_number = c(1:6),
Start = c(2,7,1,15,12,23),
End = c(5,10,4,18,15,26))

我尝试了几种解决这个问题的方法,最终得到了以下解决方案:
require(dplyr)    
filtered.main_data =
main_data %>%
rowwise() %>%
mutate(present = any(Day >= spans_to_filter$Start & Day <= spans_to_filter$End)) %>%
filter(present) %>%
data.frame()

这工作得很好,但我注意到如果我有很多数据可能需要一段时间来处理(我假设是因为我正在执行逐行比较)。我仍在学习 R 的来龙去脉,我想知道是否有更有效的方法来执行此操作,最好使用 dplyr/tidyr?

最佳答案

在从 v1.9.8 开始的 data.table 包中,已经实现了非对等连接。有了这个,我创建了一个包装函数 inrange()对于这些类型的操作,任务涉及查找点是否位于提供的任何间隔内,如果是,则返回 TRUE , 否则 FALSE .

require(data.table) # v>=1.9.8
setDT(main_data)[Day %inrange% spans_to_filter[, 2:3]] # inclusive bounds
# Day
# 1: 1
# 2: 2
# 3: 3
# 4: 4
# 5: 5
# 6: 7
# 7: 8
# 8: 9
# 9: 10
# 10: 12
# 11: 13
# 12: 14
# 13: 15
# 14: 16
# 15: 17
# 16: 18
# 17: 23
# 18: 24
# 19: 25
# 20: 26

?inrange更多。

关于r - 按范围过滤一个数据框的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36454565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com