假设我有一个数据框,其中包含一堆数据和一个日期/时间列,指示何时收集每个数据点.我有另一个列出时间跨度的数据框,其中"开始"列表示每个跨距开始的日期/时间,"结束"列表示每个跨度结束的日期/时间.
我在下面使用简化数据创建了一个虚拟示例:
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))
Run Code Online (Sandbox Code Playgroud)
我玩弄了几种解决这个问题的方法,最后得到了以下解决方案:
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()
Run Code Online (Sandbox Code Playgroud)
这工作得非常好,但是我注意到如果我有大量数据可能需要一段时间来处理(我假设因为我正在进行逐行比较).我还在学习R的来龙去脉,我想知道是否有更有效的方法来执行此操作,最好是使用dplyr/tidyr?
我有两个数据框,
user=c(rep('A',7),rep('B',8))
data = seq(1:15)
date = as.Date(c('2016-01-01','2016-01-02','2016-01-03','2016-01-04','2016-01-05','2016-01-06','2016-01-07','2016-01-08','2016-01-09','2016-01-10','2016-01-11','2016-01-12','2016-01-13','2016-01-14','2016-01-15'))
df = data.frame(user,date,data)
df
user date data
1 A 2016-01-01 1
2 A 2016-01-02 2
3 A 2016-01-03 3
4 A 2016-01-04 4
5 A 2016-01-05 5
6 A 2016-01-06 6
7 A 2016-01-07 7
8 B 2016-01-08 8
9 B 2016-01-09 9
10 B 2016-01-10 10
11 B 2016-01-11 11
12 B 2016-01-12 12
13 B 2016-01-13 13
14 B 2016-01-14 14
15 B 2016-01-15 15
Run Code Online (Sandbox Code Playgroud)
和
df1 =data.frame(user = c('A','B'), …Run Code Online (Sandbox Code Playgroud)