我还是R的新手。从这个示例表中,您可以清楚地看到diff列上有一些累积值。因此,如何将这些值传播到NA值,这些值会将许多行累积到一行中,因为我的设备在记录值时会在几个小时内丢失值,但它们仍然可以在下一个小时内获得正确的值。
我的示例数据:
DateTime diff1 diff2
1 2017-06-11 05:00:00 366 25
2 2017-06-11 06:00:00 380 22
3 2017-06-11 07:00:00 365 40
4 2017-06-11 08:00:00 366 45
5 2017-06-11 09:00:00 361 91
6 2017-06-11 10:00:00 1782 NA
7 2017-06-11 11:00:00 NA 46
8 2017-06-11 12:00:00 NA 44
9 2017-06-11 13:00:00 NA 89
10 2017-06-11 14:00:00 NA NA
11 2017-06-11 15:00:00 345 46
我必须设置手动条件,如果它大于一个值(大约1000或其他),它将被删除并更改为大约值。但这是我最愚蠢的想法。这对我的整个数据(大约1k行或更多)不适用于一个小例子。我不知道如何修复它并设置最佳条件来过滤和填充正确的值,以便在填充值之前获得更明智的数据准备。
输出应该是这样的:
binning by mean of accumulated value
DateTime diff1 diff2
1 2017-06-11 05:00:00 366.0 25.0
2 2017-06-11 06:00:00 380.0 22.0
3 2017-06-11 07:00:00 365.0 40.0
4 2017-06-11 08:00:00 366.0 45.0
5 2017-06-11 09:00:00 361.0 45.5
6 2017-06-11 10:00:00 356.4 45.5
7 2017-06-11 11:00:00 356.4 46.0
8 2017-06-11 12:00:00 356.4 44.0
9 2017-06-11 13:00:00 356.4 44.5
10 2017-06-11 14:00:00 356.4 44.5
11 2017-06-11 15:00:00 345.0 46.0
[OR] by na.approx()
DateTime diff1 diff2
1 2017-06-11 05:00:00 366.0000 25.00000
2 2017-06-11 06:00:00 380.0000 22.00000
3 2017-06-11 07:00:00 365.0000 40.00000
4 2017-06-11 08:00:00 366.0000 45.00000
5 2017-06-11 09:00:00 361.0000 45.33333
6 2017-06-11 10:00:00 358.3333 45.66667
7 2017-06-11 11:00:00 355.6667 46.00000
8 2017-06-11 12:00:00 353.0000 44.00000
9 2017-06-11 13:00:00 350.3333 44.66667
10 2017-06-11 14:00:00 347.6667 45.33333
11 2017-06-11 15:00:00 345.0000 46.00000
我需要的最重要的一点就是将这些累积值明智地转换为NA。 任何想法请帮助。非常感谢你先生。
答案 0 :(得分:2)
以下是基础R解决方案:
df[c('diff1', 'diff2')] <- lapply(df[c('diff1', 'diff2')], function(x){
g <- cumsum(!is.na(x))
ave(x, g, FUN = function(y) y[1] / length(y))
})
# > df
# DateTime diff1 diff2
# 1 2017-06-11 05:00:00 366.0 25.0
# 2 2017-06-11 06:00:00 380.0 22.0
# 3 2017-06-11 07:00:00 365.0 40.0
# 4 2017-06-11 08:00:00 366.0 45.0
# 5 2017-06-11 09:00:00 361.0 45.5
# 6 2017-06-11 10:00:00 356.4 45.5
# 7 2017-06-11 11:00:00 356.4 46.0
# 8 2017-06-11 12:00:00 356.4 44.0
# 9 2017-06-11 13:00:00 356.4 44.5
# 10 2017-06-11 14:00:00 356.4 44.5
# 11 2017-06-11 15:00:00 345.0 46.0
我使用的原始数据的 dput
:
sample.df <- structure(list(DateTime = c("2017-06-11 05:00:00", "2017-06-11 06:00:00",
"2017-06-11 07:00:00", "2017-06-11 08:00:00", "2017-06-11 09:00:00",
"2017-06-11 10:00:00", "2017-06-11 11:00:00", "2017-06-11 12:00:00",
"2017-06-11 13:00:00", "2017-06-11 14:00:00", "2017-06-11 15:00:00"
), diff1 = c(366L, 380L, 365L, 366L, 361L, 1782L, NA, NA, NA,
NA, 345L), diff2 = c(25L, 22L, 40L, 45L, 91L, NA, 46L, 44L, 89L,
NA, 46L)), .Names = c("DateTime", "diff1", "diff2"), row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11"), class = "data.frame")