Работа с матрицей в 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, который, прежде всего, читает таблицу in .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

Как я могу решить эту проблему?

1 ответ

  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. И, наконец, установите на те различия, которые не имеют смысла.

    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