R中的时间序列 – 使用不同的时间戳对齐数据

我有一组二元数据.因此,对话中的每个人都可以在5分钟(300秒)内自由切换2个任务之间的次数,并记录每个人在任务之间切换的时间.

Participant A   Participant B   
Time    Task    Time    Task 
0       1       0       0
21.43   0      23.08    1
42.86   1      46.16    0
64.29   0      69.24    1
85.72   1      92.32    0
107.15  0      115.4    1
128.58  1     138.48    0
150.01  0     161.56    1
171.44  1     184.64    0
192.87  0     207.72    1
214.3   1     230.8     1
235.73  0     253.88    0
257.16  1     276.96    0
278.59  0       

我希望通过为两个人创建一个共同的时间线来转换数据,更具体地说,有六十五秒的间隔(占用300秒),并且能够显示每个人每隔5秒钟做一次的任务.

这是结果应该如何的示例(在此示例中,它以10秒为间隔).


Time PartA  PptB
0      1    0
10     1    0
20     1    0
30     0    1
40     0    1
50     1    0
60     1    0
70     0    1
80     0    1
90     1    1
100    1    0
110    0    0
120    0    1
130    1    1
140    1    0
150    1    0
160    0    0
170    0    1
180    1    1
190    1    0
200    0    0
210    0    1
220    1    1
230    1    1
240    0    1
250    0    1
260    1    0
270    1    0
280    0    0
290    0    0

我怎样才能做到这一点?

最佳答案 例如,你可以这样做:

## read the data as it is shown in the question
dat <- read.table(text='Participant A   Participant B   
Time    Task    Time    Task 
0       1       0       0
21.43   0      23.08    1
42.86   1      46.16    0
64.29   0      69.24    1
85.72   1      92.32    0
107.15  0      115.4    1
128.58  1     138.48    0
150.01  0     161.56    1
171.44  1     184.64    0
192.87  0     207.72    1
214.3   1     230.8     1
235.73  0     253.88    0
257.16  1     276.96    0
278.59  0',header=TRUE,skip=1,fill=TRUE)    
## create data for each participant
partA = data.frame(dat[,1:2],part='A')
partB = setNames(data.frame(dat[,3:4],part='B'),names(partA))
## merge the 2 frames  and order vs Time
dat.all = rbind.data.frame(partA,partB)
dat.all = dat.all[complete.cases(dat.all),]
dat.all = dat.all[order(dat.all$Time),]

你可以查看结果:

head(dat.all)
    Time Task part
1   0.00    1    A
15  0.00    0    B
2  21.43    0    A
16 23.08    1    B
3  42.86    1    A
17 46.16    0    B

OP clarifi后继续编辑….

基本上我是:

>使用xts包创建2个时间序列
>每隔k秒对齐一次
>合并他们
>在每个NA之前用最近的非NA替换每个NA.

希望很清楚,解决方案有点长,因为使用不会以方便的形式提供数据.

library(reshape2)
dat.all <- 
dcast(Time~part,data=dat.all,value.var="Task",fill=0)
library(xts)
k <- 10

origin <- Sys.time()
dat_xts <- 
  xts(dat.all[,c('A','B')], origin+dat.all$Time)
dat_target= xts( seq(0,300,k),index(dat_xts)[1]+ seq(0,300,k))

dat_xts = align.time(dat_xts,n=k)
dat_target = align.time(dat_target,n=k)

head(na.locf(merge(dat_xts,dat_target)))
 # A B dat_target
# 2014-03-08 13:48:40 1 0          0
# 2014-03-08 13:48:50 1 0         10
# 2014-03-08 13:49:00 0 0         20
# 2014-03-08 13:49:00 0 1         20
# 2014-03-08 13:49:10 0 1         30
# 2014-03-08 13:49:20 1 0         40
点赞