楼主: 18174715760
4312 13

[问答] 怎么让用R来筛选和数量数据啊? [推广有奖]

11
llb_321 在职认证  发表于 2022-5-4 21:10:14
上午忙,随便写了补充代码。
下面,我用示例数据验证了一下,没问题,你可以参考一下。

  1. library(dplyr)
  2. set.seed(2022)
  3. #生成示例数据
  4. d <- data.frame(
  5.   ID = c(rep("A", 24), rep("B", 12), rep("C", 6), rep("D", 24)),
  6.   year = c(rep(c(2020, 2021), each = 12),
  7.            rep(2020, 12),  rep(2021, 6),
  8.            rep(c(2019, 2020), each = 12)),
  9.   month = c(rep(1:12, 3), 1:6, rep(1:12, 2)),
  10.   x3 = sample(c(1:10, NA), 66, replace = T),
  11.   x4 = sample(1:10, 66, replace = T),
  12.   x5 = sample(1:10, 66, replace = T))
  13. table(d[, 1], d[, 2], !is.na(d[, 4])) #查看各ID各年度的正常记录数和NA记录数
  14. #NA记录数
  15. #, ,  = FALSE
  16. #     2019 2020 2021
  17. #A    0    2    0
  18. #B    0    2    0
  19. #C    0    0    0
  20. #D    0    0    0
  21. #正常记录数
  22. #, ,  = TRUE
  23. #     2019 2020 2021
  24. #A    0   10   12
  25. #B    0   10    0
  26. #C    0    0    6
  27. #D   12   12    0
复制代码


可以看出A、B的2020年度存在NA,不符合统计要求;C的2021年只有6个月记录,也不符合要求。解决方案:按ID和year分组,计算各组的和、均值,同时统计记录数(作为临时变量),去除存在NA的结果,筛选月份全(年度记录数等于12)的结果,去除临时变量。

  1. new <- d %>%
  2.   group_by(ID, year) %>%
  3.   summarize(x3Sum = sum(x3),
  4.             x4Sum = sum(x4),
  5.             x5Avr = mean(x5),
  6.             nM = n()) %>%
  7.   na.omit() %>%
  8.   filter(nM == 12) %>%
  9.   select(-nM)
  10. #  ID     year x3Sum x4Sum x5Avr
  11. #1 A      2021    59    55  5   
  12. #2 D      2019    80    64  6.5
  13. #3 D      2020    70    66  6.25
复制代码


这段代码,你可以一步步地执行,看看每一步结果的变换,就可以验证上午的代码是可用的。

当然,常规操作,可以在最开始做数据清洗,但是因为R中NA可以参与计算,所以我们最后清洗,是一样的,这样做的好处是,你可以更清楚的看到未清洗前那些数据受NA影响。而因为数据量太大,常规清洗再计算,你就不知道到底那些数据被干掉了。

12
18174715760 发表于 2022-5-5 08:18:39
llb_321 发表于 2022-5-4 10:28
再试试上面的代码,执行时出的提示信息不用管它
谢谢呀!![em20]

13
18174715760 发表于 2022-5-5 08:28:06
llb_321 发表于 2022-5-4 10:28
再试试上面的代码,执行时出的提示信息不用管它
呜呜呜,可以了,你好厉害啊

14
llb_321 在职认证  发表于 2022-5-5 09:54:38
18174715760 发表于 2022-5-5 08:28
呜呜呜,可以了,你好厉害啊
可以就好了,没什么厉害的,碰巧知道一点儿而已

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-6 08:16