【发布时间】:2017-01-30 10:51:41
【问题描述】:
第一后卫:
t.d
V1 V2 V3 V4
1 1 6 11 16
2 2 7 12 17
3 3 8 13 18
4 4 9 14 19
5 5 10 15 20
names(t.d) <- c("ID","A","B","C")
t.d$FinalTime <- c("7/30/2009 08:18:35","9/30/2009 19:18:35","11/30/2009 21:18:35","13/30/2009 20:18:35","15/30/2009 04:18:35")
t.d$InitTime <- c("6/30/2009 9:18:35","6/30/2009 9:18:35","6/30/2009 9:18:35","6/30/2009 9:18:35","6/30/2009 9:18:35")
>t.d
ID A B C FinalTime InitTime
1 1 6 11 16 7/30/2009 08:18:35 6/30/2009 9:18:35
2 2 7 12 17 9/30/2009 19:18:35 6/30/2009 9:18:35
3 3 8 13 18 11/30/2009 21:18:35 6/30/2009 9:18:35
4 4 9 14 19 13/30/2009 20:18:35 6/30/2009 9:18:35
5 5 10 15 20 15/30/2009 04:18:35 6/30/2009 9:18:35
第二个 DF:
> s.d
F D E Time
1 10 19 28 6/30/2009 08:18:35
2 11 20 29 8/30/2009 19:18:35
3 12 21 30 9/30/2009 21:18:35
4 13 22 31 01/30/2009 20:18:35
5 14 23 32 10/30/2009 04:18:35
6 15 24 33 11/30/2009 04:18:35
7 16 25 34 12/30/2009 04:18:35
8 17 26 35 13/30/2009 04:18:35
9 18 27 36 15/30/2009 04:18:35
输出为:
从 DF "t.d" 我必须计算 "FinalTime" 和 "InitTime" 之间每一行的时间间隔(InitTime 总是小于 FinalTime)。
必须形成来自“s.d”的另一个DF“temp”,其数据仅在上述时间间隔内,然后必须采用“F”、“D”、“E”的最新值并将其附加到计算时间间隔的“t.d”的“第 i”行。
我们还要看看新形成的DF“temp”是否满足以下条件:
这里的'j'代表每一行的值:
if(temp$F[j] < 35.5) + (temp$D[j] >= 100) >= 1)
{
temp$Flag <- 1
} else{
temp$Flag <- 0
}
最初我在数据框中有 300 万行,每个 DF 中有 20 列。
我已经使用“for 循环”解决了上述问题,但显然需要 2 到 3 天,因为行数很多。
(如果每行满足多个条件,我是否必须向结果 DF 添加新列?)
有人可以提出不同的技术吗?喜欢使用 apply 函数吗?
【问题讨论】:
-
我不确定,但 dplyr 包中的聚合函数似乎是您正在寻找的。span>
-
首先,您的日期时间列应该是正确的类型。将这些列强制为
POSIXct。接下来看看data.table的foverlaps函数。