2016-07-28 5 views
0

У меня есть CSV значений втор-по-сек, который выглядит следующим образом:R: Гистограмма недостающих данных

"x","timestamp","value" 
"1",2016-01-01 00:00:00,124 
"2",2016-01-01 00:00:01,121 
"3",2016-01-01 00:00:02,NA 
"4",2016-01-01 00:00:03,NA 
"5",2016-01-01 00:00:04,NA 
"6",2016-01-01 00:00:05,123 
"7",2016-01-01 00:00:06,122 
"8",2016-01-01 00:00:07,124 
"9",2016-01-01 00:00:08,NA 
"10",2016-01-01 00:00:09,124 

Таким образом, есть некоторые данные отсутствуют и помечен как NA. Теперь я хочу сделать гистограмму длины отсутствующих блоков данных. В данном примере это означало бы подсчитать, сколько недостающих блоков данных имеет длину 1 sec (1), 2 sec (0), 3 sec (1) и так далее.

В моих данных реальной жизни, установленных бункера/интервалы будут немного по-другому, я думаю, что из этих восьми категорий:

= 1 sec 
2 to 5 sec 
6 to 10 sec 
11 to 30 sec 
31 to 300 sec 
301 to 3600 sec 
3600 to 86400 sec 
> 86400 sec 

Так что моя идея состояла в том, чтобы позволить R кода запуска через все строки в CSV и всякий раз, когда он обнаруживает значение NA, подсчитывать строки до тех пор, пока он снова не найдет реальное значение. Восемь категорий могут быть целочисленными переменными, которые подсчитываются до +1 каждый раз, когда обнаружен подходящий блок из NA -значений.

Как полный R-noob, я просто понятия не имею, как это сделать. Помощь будет высоко оценена :)

+0

Использовать кодировку длины прогона. См. Справку для '? Rle'. – Andrie

ответ

0

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

set.seed(42) 

# Create some sample data 
df <- data.frame(x = 1:100, 
       timestamp = seq(from = Sys.time() - 99, to = Sys.time(), by = "secs"), 
       value = sample(c(NA, 1:3), 100, replace = TRUE)) 

# Runs of identical data 
runs <- rle(is.na(df$value)) 

# Those that are missing 
missing <- which(runs$values) 

# The end positions in the sequence that are missing 
positions <- cumsum(runs$lengths) 

# The start times 
start <- df$timestamp[positions[missing] - runs$lengths[missing] + 1] 
end <- df$timestamp[positions[missing]] 

# Time difference 
delta <- difftime(end, start, "seconds") 

# Combine in a usable data.frame 
output <- data.frame(StartRow = positions[missing] - runs$lengths[missing] + 1, 
        EndRow = positions[missing], 
        StartTime = start, 
        EndTime = end, 
        Duration = delta) 
+0

Отлично, спасибо! Это создало идеальный вектор, чтобы продолжать работать с :) – Bene

0

Может быть, это полезно

temp <- rle(diff(c(0,cumsum(is.na(df1$value))))) 
runs <- temp$lengths[temp$values==1] 
table(cut(runs,breaks = c(0,1,5,10,30,300,3600,86400,Inf),right = T)) 
hist(runs,breaks = c(1,5,10,30,300,3600,86400))