按行和列使用R中的矩阵并迭代地删除行

时间:2016-11-08 16:58:40

标签: r csv matrix

我想通过写一条消息来计算按下键盘不同键所需的时间间隔。

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

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

在下面这个非常简单的示例中,我们可以看到时间16777248已按下5.0067901611328125e-06键并在0.21875882148742676时间释放,因此,此键的时间间隔为{ {1}}。密钥0.21875882148742676-5.0067901611328125e-06的时间间隔应为72

0.1861410140991211-0.08675289154052734

目前我在R中编写了一个代码,首先,在.csv中读取表格。然后它搜索第二列中的第一个1并获取相应的键名。接下来,它使用0搜索上一个键。它计算时间间隔,将此值保存在向量中,然后从矩阵中删除这两行。接下来,它应重复此操作,直到不再有行为止。

16777248    0    5.0067901611328125e-06

72          0    0.08675289154052734

72          1    0.1861410140991211

16777248    1    0.21875882148742676

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

此时我收到以下错误:

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), ]
                }
            }
    }

}

我怎么能解决这个问题?

1 个答案:

答案 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