下面,我用示例数据验证了一下,没问题,你可以参考一下。
- library(dplyr)
- set.seed(2022)
- #生成示例数据
- d <- data.frame(
- ID = c(rep("A", 24), rep("B", 12), rep("C", 6), rep("D", 24)),
- year = c(rep(c(2020, 2021), each = 12),
- rep(2020, 12), rep(2021, 6),
- rep(c(2019, 2020), each = 12)),
- month = c(rep(1:12, 3), 1:6, rep(1:12, 2)),
- x3 = sample(c(1:10, NA), 66, replace = T),
- x4 = sample(1:10, 66, replace = T),
- x5 = sample(1:10, 66, replace = T))
- table(d[, 1], d[, 2], !is.na(d[, 4])) #查看各ID各年度的正常记录数和NA记录数
- #NA记录数
- #, , = FALSE
- # 2019 2020 2021
- #A 0 2 0
- #B 0 2 0
- #C 0 0 0
- #D 0 0 0
- #正常记录数
- #, , = TRUE
- # 2019 2020 2021
- #A 0 10 12
- #B 0 10 0
- #C 0 0 6
- #D 12 12 0
可以看出A、B的2020年度存在NA,不符合统计要求;C的2021年只有6个月记录,也不符合要求。解决方案:按ID和year分组,计算各组的和、均值,同时统计记录数(作为临时变量),去除存在NA的结果,筛选月份全(年度记录数等于12)的结果,去除临时变量。
- new <- d %>%
- group_by(ID, year) %>%
- summarize(x3Sum = sum(x3),
- x4Sum = sum(x4),
- x5Avr = mean(x5),
- nM = n()) %>%
- na.omit() %>%
- filter(nM == 12) %>%
- select(-nM)
- # ID year x3Sum x4Sum x5Avr
- #1 A 2021 59 55 5
- #2 D 2019 80 64 6.5
- #3 D 2020 70 66 6.25
这段代码,你可以一步步地执行,看看每一步结果的变换,就可以验证上午的代码是可用的。
当然,常规操作,可以在最开始做数据清洗,但是因为R中NA可以参与计算,所以我们最后清洗,是一样的,这样做的好处是,你可以更清楚的看到未清洗前那些数据受NA影响。而因为数据量太大,常规清洗再计算,你就不知道到底那些数据被干掉了。



雷达卡

[em20]
京公网安备 11010802022788号







