R:通过data.table mutate()迭代应用函数
我有一个包含200万行的数据表,其中包含以下数据: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
- 时间戳(历元秒)
- 持续时间(秒)
时间戳%%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(时间,如果(很高兴我能帮忙的话)!