合并数据,设置NA值并替换NA值

时间:2017-05-28 00:05:13

标签: r replace merge na

我发现我的数据集不一致。数据帧称为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

我将不胜感激任何帮助。 提前谢谢。

1 个答案:

答案 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