我发现我的数据集不一致。数据帧称为DF1例如,时间9:49有NA值,但时间9:48根本不存在。它看起来像这样:
Time | 1 | 2
2016-05-11 09:45:00 | NA | NA
2016-05-11 09:46:00 | 4.4 | 6.6
2016-05-11 09:47:00 | 5.8 | 7.0
2016-05-11 09:49:00 | NA | NA
2016-05-11 09:50:00 | 5.6 | 7.3
2016-05-11 09:51:00 | 7.4 | 7.4
所以我创建了一个新的数据框架,包括所有日期和分钟:
D2 = as.data.frame(seq(from = as.POSIXct(“2016-05-11 09:45”,tz =“GMT”), to = as.POSIXct(“2016-05-11 09:50”,tz =“GMT”),by =“min”))
如何合并D2和DF1,以便时间9:48的第1列和第2列中的值将变为NA值。它应该是这样的:
Time | 1 | 2
2016-05-11 09:45:00 | NA | NA
2016-05-11 09:46:00 | 4.4 | 6.6
2016-05-11 09:47:00 | 5.8 | 7.0
2016-05-11 09:48:00 | NA | NA
2016-05-11 09:49:00 | NA | NA
2016-05-11 09:50:00 | 5.6 | 7.3
2016-05-11 09:51:00 | 7.4 | 7.4
在下一步中,我想替换NA值。如果它是一个NA值,则应该用前一个元素和下一个元素的平均值替换。如果有两个NA值,则应将两个值替换为前两个值和下一个两个值的平均值。如果有三个......直到四个NA值。如果有超过4个连续的NA值,则不得更改这些值。我的新数据应如下所示:
Time | 1 | 2
2016-05-11 09:45:00 | NA | NA --> no previous value --> NA
2016-05-11 09:46:00 | 4.4 | 6.6
2016-05-11 09:47:00 | 5.8 | 7.0
2016-05-11 09:48:00 | 5.8 | 7.1 --> column 1 (4.4+5.8+5.6 + 7.4)/4
2016-05-11 09:49:00 | 5.8 | 7.1 --> column 2 (7.3+ 7.4 + 6.6 + 7.0)/4
2016-05-11 09:50:00 | 5.6 | 7.3
2016-05-11 09:51:00 | 7.4 | 7.4
我将不胜感激任何帮助。 提前谢谢。
答案 0 :(得分:1)
# I edited you data slightly to include an example of a single row with missing values
df1 <- readr::read_csv(
"time,var1,var2
2016-05-11 09:45:00,NA,NA
2016-05-11 09:46:00,4.4,6.6
2016-05-11 09:47:00,NA,NA
2016-05-11 09:48:00,5.6,7.4
2016-05-11 09:49:00,5.8,7.0
2016-05-11 09:51:00,NA,NA
2016-05-11 09:52:00,5.6,7.3
2016-05-11 09:53:00,7.4,7.4")
解决这些问题的一种很好的方法是使隐式缺少观察明确缺失,是使用tidyr::complete
。
library(tidyr)
library(lubridate)
df2 <- df1 %>%
complete(time = seq(ymd_hm("2016-05-11 09:45"), ymd_hm("2016-05-11 09:53"), by = "min"))
df2
#> # A tibble: 9 x 3
#> time var1 var2
#> <dttm> <dbl> <dbl>
#> 1 2016-05-11 09:45:00 NA NA
#> 2 2016-05-11 09:46:00 4.4 6.6
#> 3 2016-05-11 09:47:00 NA NA
#> 4 2016-05-11 09:48:00 5.6 7.4
#> 5 2016-05-11 09:49:00 5.8 7.0
#> 6 2016-05-11 09:50:00 NA NA
#> 7 2016-05-11 09:51:00 NA NA
#> 8 2016-05-11 09:52:00 5.6 7.3
#> 9 2016-05-11 09:53:00 7.4 7.4
我不确定在更复杂的情况下该怎么做,其中有连续的行具有缺失值,但是这里有一种方法可以解决更简单的情况,即只有一行。 lag
and lead
from dplyr
可能会有所帮助。
library(dplyr)
df2 %>%
mutate(lag1 = lag(var1, n = 1L, order_by = time),
lead1 = lead(var1, n = 1L, order_by = time)) %>%
rowwise() %>%
mutate(var1_edit = if_else(is.na(var1), mean(c(lag1, lead1)), var1)) %>%
select(time, var1, var1_edit) %>% # for simplicity focusing on one column
ungroup()
#> time var1 var1_edit
#> 1 2016-05-11 09:45:00 NA NA
#> 2 2016-05-11 09:46:00 4.4 4.4
#> 3 2016-05-11 09:47:00 NA 5.0
#> 4 2016-05-11 09:48:00 5.6 5.6
#> 5 2016-05-11 09:49:00 5.8 5.8
#> 6 2016-05-11 09:50:00 NA NA
#> 7 2016-05-11 09:51:00 NA NA
#> 8 2016-05-11 09:52:00 5.6 5.6
#> 9 2016-05-11 09:53:00 7.4 7.4