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

R:通过data.table mutate()迭代应用函数,r,data.table,R,Data.table,我有一个包含200万行的数据表,其中包含以下数据: 时间戳(历元秒) 持续时间(秒) 我想做的是将这对(时间戳,持续时间)转换成一个向量(partial_0,…,partial_k),其中partial_I是由分钟边界划分的范围[时间戳,时间戳+持续时间]。(分钟边界由时间戳%%60==0表示 作为一个例子,考虑数据是: timestamp duration 1: 100 90 2: 101 90 3: 110 60 4

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

  • 时间戳(历元秒)
  • 持续时间(秒)
我想做的是将这对(时间戳,持续时间)转换成一个向量(partial_0,…,partial_k),其中partial_I是由分钟边界划分的范围[时间戳,时间戳+持续时间]。(分钟边界由
时间戳%%60==0
表示

作为一个例子,考虑数据是:

timestamp duration
1:       100       90
2:       101       90
3:       110       60
4:       110       30
5:       120       20
split\u窗口(时间戳、持续时间)
的结果是:

(20,60,10)
(19,60,11)
(10,50)
(10,20)
(20)
这是拆分窗口:

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]
}
mutate
将时间戳和持续时间都显示为向量,而不是在向量上迭代

我该怎么做呢


另外,请随意“修复”拆分窗口,使其更为惯用。请尝试使用
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
dat=data.table(时间戳=c(100101110120),
持续时间=c(90,90,60,30,20))
f=功能(时间,dur){
a=上限(时间/60)
b=地板((时间+dur)/60)
partials=diff(c)时间,如果(a 0)
}
dat[,partials:=Map(f,时间戳,持续时间)]
>dat
#时间戳持续时间部分
# 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

尝试使用
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
dat=data.table(时间戳=c(100101110120),
持续时间=c(90,90,60,30,20))
f=功能(时间,dur){
a=上限(时间/60)
b=地板((时间+dur)/60)
partials=diff(c)时间,如果(a 0)
}
dat[,partials:=Map(f,时间戳,持续时间)]
>dat
#时间戳持续时间部分
# 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

谢谢@siralen。我不知道
diff
,虽然我熟悉其他语言中的map()操作,但我不知道R中的map()操作。为了清楚起见,
a
是范围内的第一分钟边界,
b
是范围内的最后一分钟边界,
c(时间,如果需要)(很高兴我能帮上忙!谢谢@siralen。我不知道
diff
,虽然我熟悉其他语言中的map()操作,但我在R中不知道。为了清楚起见,
a
是范围内的第一分钟边界,
b
是范围内的最后一分钟边界,
c(时间,如果(很高兴我能帮忙的话)!