首页 文章

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

提问于
浏览
4

我有一组二元数据 . 因此,对话中的每个人都可以在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

我怎样才能做到这一点?

2 回答

  • 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澄清....

    基本上我是:

    • 使用 xts 包创建2个时间序列

    • 每隔k秒对齐一次

    • 合并它们

    • 用之前的最新非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
    
  • 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
    

相关问题