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

时间:2014-03-08 10:30:24

标签: r time-series

我有一组二元数据。因此,对话中的每个人都可以在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秒),并且能够显示每个人每个人在做什么任务。第二个间隔。

这是结果应如何显示的示例(在此示例中,它以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

我该怎么做?

2 个答案:

答案 0 :(得分:2)

例如,你可以这样做:

## 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 ....

之后继续编辑

基本上我是:

  1. 使用xts
  2. 创建2个时间序列
  3. 每隔k秒对齐一次
  4. 合并他们
  5. 使用最新的非NA替换每个NA。
  6. 希望很清楚,解决方案有点长,因为使用不会以方便的形式提供数据。

    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
    

答案 1 :(得分:0)

我假设df有两列,第一列是时间,第二列是任务。

# generate some dummy data
df = data.frame(Time=sort(runif(100,0,300)),Task=rbinom(100,1,0.5))
xout = seq(0,300,5)
result = data.frame(approx(df$Time,df$Task,xout,method="constant",rule=2))
head(df)
head(result)

结果将如下所示

> head(df)
       Time Task
1  5.158972    0
2  9.799133    1
3 14.676851    0
4 14.938065    0
5 16.774653    0
6 18.433240    1
> head(result)
   x y
1  0 0
2  5 0
3 10 1
4 15 0
5 20 1
6 25 1