2016-11-08 27 views
0

我想通过编写消息来计算按下键盘的不同键所需的时间间隔。按行和列处理R中的矩阵并迭代删除行

为了获取数据,我使用了一个在写入文本后生成.csv的程序。这个.csv有三列:第一列按键和释放键,第二列表示按键是否被按下(0)或释放(1),最后一列是每个事件的注册时间。

然后这个想法是计算每个键需要的时间间隔,因为它被按下直到它被释放。

在下面的额外简单的例子,我们可以看出,关键16777248已经在时间5.0067901611328125e-06被按下,并且在时间0.21875882148742676释放,因此,对于这个关键的时间间隔为0.21875882148742676-5.0067901611328125e-06。密钥72的时间间隔应为0.1861410140991211-0.08675289154052734

16777248 0 5.0067901611328125e-06 

72   0 0.08675289154052734 

72   1 0.1861410140991211 

16777248 1 0.21875882148742676 

目前我已经在R中编写了一个代码,首先在.csv中读取表格。然后搜索第二列中的第一个,并取对应的键名称。接下来,它用0搜索前一个键。它计算时间间隔,将该值保存在一个向量中,然后从矩阵中删除这两行。以下,它应该重复,直到没有更多的行。

data.csv <- read.table("example.csv",header=F, sep=",", dec=".") 
myTable<- data.csv 
keySearched=0 
timeInterval=c(rep(0,length(myTable[,1]))) 
L=(length(myTable[,1])) 

for(i in 1:L){ 
    if(myTable[i,2]==1){ 
     keySearched <- myTable[i,1] 
      for(j in 1:(i-1)){ 
       if(myTable[j,1]==keySearched){ 
        timeInterval[j] <- (myTable[i,3]-myTable[j,3]) 
        myTable <- myTable[ -c(j,i), ] 
       } 
      } 
    } 

} 

问题是,有时值myTable [x,y]是NA,因为相应的行已被删除。在每次迭代中,删除两行(使用按下的键和相应的释放键)。

在这一点上,我得到以下错误:

Error in if (myTable[j, 1] == keySearched) { : 
    missing value where TRUE/FALSE needed 

我怎么能解决这个问题?

+0

“对应的行已被删除”。这是否意味着您没有按下并释放相同数量的按键#?如果是这样,您应该决定如何处理丢失的数据。 –

+0

当然,我有相同数量的按键和释放按键。 –

回答

0

你可以尝试做这样的:

key = c(3,6,3,8,8,3,6,3) 
pressed = c(0,0,1,0,1,0,1,1) 
time = c(12,14,16,17,19,22,34,35) 
a = data.frame(key,time,pressed) 

>a 
    key time pressed 
1 3 12  0 
2 6 14  0 
3 3 16  1 
4 8 17  0 
5 8 19  1 
6 3 22  0 
7 6 34  1 
8 3 35  1 

首先为了您的数据帧(或者,如果你喜欢矩阵)利用密钥号,然后的时间。这应该将按下和释放的按键组合在一起。然后使用diff计算相同键之间的时间差。最后,设置为NA那些没有意义的差异。

a = a[order(a$key,a$time),] 
a$lapse = c(0,diff(a$time)) 
a$lapse[seq(1,nrow(a),2)] = NA 

>a 
    key time pressed lapse 
1 3 12  0 NA 
3 3 16  1  4 
6 3 22  0 NA 
8 3 35  1 13 
2 6 14  0 NA 
7 6 34  1 20 
4 8 17  0 NA 
5 8 19  1  2 
+0

太棒了,太棒了!非常感谢你!! (为了得到最初的订单,我只需要在按键和时间排序之前生成一个额外的列,然后在结束时,一旦我有了失误,再按额外的一列重新排序。) –