gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:03:34 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com