我有一个包含200万行的数据表,其中包含以下数据:
我想做的是将该对(时间戳,持续时间)转换为向量(partial_0,...,partial_k),其中partial_i是范围[timestamp,timestamp + duration )按分钟边界划分。 (分钟边界由timestamp %% 60 == 0
表示。
例如,请考虑数据:
timestamp duration
1: 100 90
2: 101 90
3: 110 60
4: 110 30
5: 120 20
split_window(timestamp, duration)
的结果是:
(20,60,10)
(19,60,11)
(10,50)
(10,20)
(20)
此处split_window
:
split_window <- function(timestamp, duration) {
v = vector(,2+floor(duration/60)) # for result, so we don't keep copying it over
i = 1
while (duration > 0) {
m = 60 - (timestamp %% 60)
if (m > duration) m = duration
v[i] = m
i = i+1
duration = duration - m
timestamp = timestamp + m
}
v[1:i-1]
}
好消息是split_window
有效。坏消息是我无法通过以下方式将其应用到我的桌面:
t %>% mutate(splits=split_window(timestamp,duration))
mutate
将时间戳和持续时间都表示为向量,而不是迭代向量。
我应该做什么呢?
另外,随时随地修复&#34; split_window更加惯用R.
答案 0 :(得分:3)
尝试使用Map
:
dat = data.table(timestamp=c(100,101,110,110,120),
duration=c(90,90,60,30,20))
f = function(time,dur) {
a = ceiling(time/60)
b = floor((time + dur)/60)
partials = diff(c(time, if (a <= b) (a:b)*60, time+dur))
partials[partials > 0]
}
dat[, partials:= Map(f, timestamp, duration)]
> dat
# timestamp duration partials
# 1: 100 90 20,60,10
# 2: 101 90 19,60,11
# 3: 110 60 10,50
# 4: 110 30 10,20
# 5: 120 20 20