我有一组二元数据。因此,对话中的每个人都可以在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
我该怎么做?
答案 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
基本上我是:
xts
包希望很清楚,解决方案有点长,因为使用不会以方便的形式提供数据。
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