【问题标题】:Working with a matrix in R by rows and columns and deleting rows iteratively在 R 中按行和列处理矩阵并迭代删除行
【发布时间】:2017-03-22 09:46:09
【问题描述】:

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

为了获取数据,我使用了一个在编写文本后生成 .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 中的表格。然后它在第二列中搜索第一个 1 并获取相应的键名。接下来,它使用 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

我该如何解决这个问题?

【问题讨论】:

  • "相应的行已被删除。"这是否意味着您没有相同数量的 key# 按下和释放?如果是这种情况,您应该决定如何处理丢失的数据。
  • 当然,我按下和释放的键数相同。

标签: r csv matrix


【解决方案1】:

你可以试试这样:

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

【讨论】:

  • 太棒了,太棒了!非常感谢!! (为了获得原始订单,我只需要在按键和时间排序之前生成一个带有真实订单的额外列,最后,一旦我有失误,就按额外的列重新排序。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 2019-07-08
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多