R:通过data.table mutate()迭代地应用函数

时间:2017-06-19 22:14:57

标签: r data.table

我有一个包含200万行的数据表,其中包含以下数据:

  • 时间戳(epoch-seconds)
  • 持续时间(秒)

我想做的是将该对(时间戳,持续时间)转换为向量(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.

1 个答案:

答案 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