【问题标题】:R: Histogram of missing dataR:缺失数据的直方图
【发布时间】:2016-12-02 15:34:31
【问题描述】:

我有一个逐秒值的 CSV,如下所示:

"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) 等等。

在我的现实生活数据集中,bins/intervals 会有点不同,我想到了这八个类别:

= 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 值时,对行数进行计数,直到它再次找到真正的值。这八个类别可以是一个整数变量,每次检测到NA-values 的拟合块时,都会向上计数+1

作为一个完整的 R-noob,我只是不知道该怎么做。非常感谢您的帮助:)

【问题讨论】:

  • 使用游程编码。请参阅?rle 的帮助。

标签: r csv time-series histogram missing-data


【解决方案1】:

我确信必须有一个时间序列解决方案,但为了让您开始(使用 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)

【讨论】:

  • 太好了,谢谢!这产生了一个完美的向量,可以继续使用:)
【解决方案2】:

也许这有帮助

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))

【讨论】:

    猜你喜欢
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2020-09-12
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多