Я пытаюсь запустить вложенный цикл for в r, который вычитает каждую строку переменной в кадре данных - PullRequest
0 голосов
/ 06 сентября 2018

Датафрейм:

Number Time 
1       10:25:00
2       10:35:15
3       10:42:26

Для каждого числа во фрейме данных я хочу вычесть время, например:

Number 1 = 10:25:00 - 10:35:15
Number 2 = 10:35:15 - 10:42:26

Мой код:

for (i in df$Number) {
    for (j in df$Time) {
        subtime <- df$Time[j] - df$Time[j+1]
      }
}

Этот код приводит только к NA

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Я думаю, вы можете искать что-то вроде этого. Результат дается в часах.

Например: 10:25:00 - 10:35:15 = - 00:10:15 = - (10/60) - (15/3600) = -0,1708333

a = data.frame(Number = c(1, 2, 3), Time = c("10:25:00", "10:35:15", "10:42:26"), stringsAsFactors = FALSE)

x = 2

timeDiff = function(x, a){

  as.difftime(a[x, 2]) - as.difftime(a[x+1, 2]) 

}    

result = sapply(2:nrow(a), timeDiff, a)

result

Обратите внимание, что невозможно вычислить такую ​​разницу для случая Number 3, поскольку потребуется четвертая строка, а предоставленный вами фрейм данных содержит только 3 строки.

Согласно подсказке Stack Overflow, я вижу вас новым пользователем. Таким образом, для будущих вложенных циклов for, я рекомендую вам исследовать sapply или lapply, так как это сделает ваш код более чистым и простым в обслуживании.

Если вам нужны дальнейшие разъяснения, не стесняйтесь комментировать мой ответ. : -)

0 голосов
/ 06 сентября 2018

Поскольку subtime переназначается в каждом цикле, по окончании цикла возвращается только последнее значение. Кроме того, на последней итерации j == length(df$Time), поэтому j + 1 выходит за границы, поэтому df$Time[j + 1] будет NA, что означает, что весь результат равен NA.

Вместо этого вы можете сделать:

df$subtime <- c(NA, diff(df$Time))

где NA - первый экземпляр, замененный подходящим значением по умолчанию для первого экземпляра. В вашем случае может потребоваться дополнительное лечение в зависимости от точного класса df$Time.

(Вы должны рассмотреть вопрос о создании MWE ваших данных, если вам нужна дополнительная помощь. То, что вы предоставили, довольно близко, но недостаточно для того, чтобы мы могли вам помочь.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...