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】:我们可以使用来自zoo
的across
和na.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的平均值的主要内容,如果未能解决你的问题,请参考以下文章