r - 合并数据、设置 NA 值和替换 NA 值

标签 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

最佳答案

创建数据

# 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

关于r - 合并数据、设置 NA 值和替换 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44222644/

相关文章:

r - 如何在R中对data.frame进行排序和过滤?

r - 使用R下载Gmail邮件内容

r - 数据框的粘贴方法

php - MySql Select 查询中的正则表达式替换

python - 如何在python中合并pandas字符串(类似连接sql)?

R包DARCH深度信念神经网络似乎无法学习 'exclusive or'

Java/Groovy 文件 IO 用图像文件自己的内容替换图像文件 - 为什么这有效?

windows - 如何将文件内容转换为cmd中的安全字符串?

python - Pandas 合并101

Git merge master 到分支并接受部分更改