R中的时间序列-将具有不同时间戳的数据对齐

4
我有一组二元数据。每个二元组中的人都可以在5分钟(300秒)内随意切换两个任务,并记录每个人在任务之间切换的时间。
我希望通过为这两个人创建一个共同的时间轴来转换数据,更具体地说,将300秒分成60个5秒的时间段,并能够显示每个5秒的时间段中每个人正在做什么任务。
下面是一个示例结果(在这个示例中,时间间隔为10秒):
时间 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
如何实现这个转换?

еңЁеүҚ5з§’й’ҹеҶ…пјҢе‘ҠиҜүжҲ‘们Aе’ҢBзҡ„TaskеҖјеҲҶеҲ«жҳҜеӨҡе°‘пјҹ - Randy Lai
嗨,我希望创建类似于Excel中查找函数的东西。因此,我将有一个新列,其中包含5秒间隔(0、5、10、15等...)。在第一个5秒间隔中,A为1,B为0。对于每个后续的5秒值,它将根据原始时间戳返回A和B的相应任务。 - user3334446
@user3334446 在你的澄清之后,你可以看到我的编辑。 - agstudy
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 说明后编辑继续....

基本上我正在做:

  1. 使用 xts 包创建两个时间序列
  2. 将它们每 k 秒对齐
  3. 合并它们
  4. 将每个 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接