2016-05-19 6 views
2

У меня есть этот образец данных, который отслеживает время включения и выключения лампы.difftime in R dataframe на основе подмножества

    time lamp status 
1 2015-01-01 12:18:17 2  ON 
2 2015-01-01 13:07:29 28  ON 
3 2015-01-01 13:11:50 28 OFF 
4 2015-01-01 13:18:28 2 OFF 
5 2015-01-01 14:07:29 28  ON 
6 2015-01-01 14:11:35 28 OFF 
7 2015-01-01 14:18:28 2  ON 
5 2015-01-01 14:18:57 2 OFF 

Я хочу добиться того, чтобы добавить четвертый столбец, содержащий длительность периода времени, когда лампа была включена (в секундах).

Нужный выход:

    time lamp status duration 
1 2015-01-01 12:18:17 2  ON  3611 
2 2015-01-01 13:07:29 28  ON  261 
3 2015-01-01 13:11:50 28 OFF  NA 
4 2015-01-01 13:18:28 2 OFF  NA 
5 2015-01-01 14:07:29 28  ON  246 
6 2015-01-01 14:11:35 28 OFF  NA 
7 2015-01-01 14:18:28 2  ON  29 
5 2015-01-01 14:18:57 2 OFF  NA 

Я уже удалось сделать это с помощью пользовательской функции, включая время и петель. BUT ... Я новичок в R, и я уверен, что это можно сделать более простым и изящным (используя подмножества, применить и/или ....). Я просто не могу понять, как?

Любые идеи, из цепей в правильном направлении?

+0

ваши "время" колонки в формате Posix? – agenis

+0

@agenis: да, это так. – Wimpel

+0

ОК спасибо. я только что изменил свой ответ – agenis

ответ

0

Это работает для меня:

library(dplyr) 
df <- df %>% mutate(sec=as.numeric(time)) %>% group_by(lamp) %>% mutate(duration=c(diff(sec), NA)) %>% select(-sec) 
df$duration[df$status=="OFF"] <- NA 
#### 1 2015-01-01 12:18:17  2  ON  3611 
#### 2 2015-01-01 13:07:29 28  ON  261 
#### 3 2015-01-01 13:11:50 28 OFF  NA 

Ваши данные:

df=structure(list(time = structure(c(1420111097, 1420114049, 1420114310, 
1420114708, 1420117649, 1420117895, 1420118308, 1420118337), class = c("POSIXct", 
"POSIXt"), tzone = ""), lamp = c(2L, 28L, 28L, 2L, 28L, 28L, 
2L, 2L), status = structure(c(2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L), .Label = c("OFF", 
"ON"), class = "factor"), duration = c(2952, 261, NA, NA, 246, 
NA, 29, NA)), .Names = c("time", "lamp", "status", "duration" 
), row.names = c(NA, -8L), class = "data.frame") 
+0

славный ... никогда не работал с dplyr до ... – Wimpel

+0

Да, это позволяет делать много манипуляций с данными в одной строке и выполняет хорошо групповые вычисления. довольно "захватывающий" – agenis