R:提取具有NA的行,删除那些满足条件A并取那些满足条件B的平均值

Posted

技术标签:

【中文标题】R:提取具有NA的行,删除那些满足条件A并取那些满足条件B的平均值【英文标题】:R: Extract rows with NAs, delete those meeting condition A and take the mean of those meeting condition B 【发布时间】:2021-09-08 01:22:22 【问题描述】:

使用下面的子集,您可以看到前 8 行在 V2、V3、V4、V5、V6 和 V7 中具有 NA,而其余行仅在其中少数中具有 NA。

我想提取从 V2 到 V7 具有 NA 的行并删除它们(条件 A)。然而 对于那些只有几个 NA 的人,我会取该列的平均值并用它替换 NA 以保留一些信息(条件 B)

V1                  V2  V3  V4  V5  V6  V7
2020-12-01 09:15:00 NA  NA  NA  NA  NA  NA
2020-12-01 09:20:00 NA  NA  NA  NA  NA  NA
2020-12-01 09:25:00 NA  NA  NA  NA  NA  NA
2020-12-01 09:30:00 NA  NA  NA  NA  NA  NA
2020-12-01 09:35:00 NA  NA  NA  NA  NA  NA
2020-12-01 09:40:00 NA  NA  NA  NA  NA  NA
2020-12-01 09:45:00 NA  NA  NA  NA  NA  NA
2020-12-01 09:50:00 NA  NA  NA  NA  NA  NA
2020-12-01 17:05:00 NA  1319.48 10685.10    38.36   156.64  612.83
2020-12-01 17:30:00 12068.88    1308.61 NA  38.43   NA  NA

通常,要删除所有带有 NA 的列,我会使用:

dataset <- dataset[complete.cases(dataset),]

并用列 (Vn) 的平均值替换 NA:

dataset$Vn <- ifelse(is.na(dataset$Vn),
                     ave(dataset$Vn, FUN = function(x) mean(x, na.rm = TRUE)),
                     dataset$Vn)

我不确定将两者结合起来的最佳方式。

【问题讨论】:

【参考方案1】:

我们可以使用来自zooacrossna.aggregate 更轻松地做到这一点

library(zoo)
library(dplyr)
df1 %>%
    mutate(across(where(is.numeric), zoo::na.aggregate))

数据

df1 <- structure(list(V1 = c("2020-12-01 09:15:00", "2020-12-01 09:20:00", 
"2020-12-01 09:25:00", "2020-12-01 09:30:00", "2020-12-01 09:35:00", 
"2020-12-01 09:40:00", "2020-12-01 09:45:00", "2020-12-01 09:50:00", 
"2020-12-01 17:05:00", "2020-12-01 17:30:00"), V2 = c(NA, NA, 
NA, NA, NA, NA, NA, NA, NA, 12068.88), V3 = c(NA, NA, NA, NA, 
NA, NA, NA, NA, 1319.48, 1308.61), V4 = c(NA, NA, NA, NA, NA, 
NA, NA, NA, 10685.1, NA), V5 = c(NA, NA, NA, NA, NA, NA, NA, 
NA, 38.36, 38.43), V6 = c(NA, NA, NA, NA, NA, NA, NA, NA, 156.64, 
NA), V7 = c(NA, NA, NA, NA, NA, NA, NA, NA, 612.83, NA)),
  class = "data.frame", row.names = c(NA, 
-10L))

【讨论】:

【参考方案2】:

对于第一个条件,你可以使用 dplyr::filter:

data <- data %>%
filter(!is.na(V2) & !is.na(v3) & ... & !is.na(V7))

对于第二个条件:

data <- data %>%
mutate(V2 = ifelse(is.na(V2), mean(data$V2, na.rm = T),V2),
       V3 = ifelse(is.na(V3), mean(data$V3, na.rm = T),V3),
       ...)

在每个步骤中,... 代表其余列的相同指令。

【讨论】:

嗯,它在我的 R 版本上运行……这很奇怪。尝试 && 而不是 & 那个什么都不做,也没有返回错误……我会继续努力的。谢谢!

以上是关于R:提取具有NA的行,删除那些满足条件A并取那些满足条件B的平均值的主要内容,如果未能解决你的问题,请参考以下文章

R语言删除不规范的值(或NA)

如果满足一行的条件,则删除多行

预编译那些事#define后面只跟一个“参数”

如何仅删除在 R 中具有所有 NA 的行? [复制]

小技巧-只删除某一列中含NA的行(R)

R语言 -- 删除 dataFrame/matrix 中含有NA或全为NA的行或列