如何在R语言中筛选无降水记录的周数据?
筛选完全无降水的周(Dry Weeks)的代码修改方案
问题描述
我开展了多个时长约一周的实验,降水数据按15分钟间隔记录,希望筛选出完全无降水的周(dry weeks),比如截图中的week 15不符合要求应被剔除。但当前使用的代码仅筛选precipitation==0的行,导致week 15被保留(仅剔除该周内有降水的行,而非整周移除)。
当前代码:
df %>% group_by(week) %>% filter(precipitation=="0")
可复现示例数据
df <- structure(list(week = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L), levels = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"), class = "factor"), precipitation = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.59999999999997, 0.800000000000011, 0.600000000000023, 0.199999999999989, 0.399999999999977, 0.400000000000034, 1, 0.799999999999955, 0.400000000000034, 0.800000000000011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.60000000000002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.200000000000045, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.200000002980232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -260L))
解决方案
要筛选整周完全无降水的数据,需要判断每个分组(week)内的所有precipitation值是否都为0,而非只保留单个值为0的行。以下是两种可行的修改方式:
方法一:用all()函数判断分组内所有值是否为0
df %>% group_by(week) %>% filter(all(precipitation == 0)) %>% ungroup() # 可选,取消分组状态,避免后续操作受分组影响
all(precipitation == 0)会检查当前分组内的所有降水值是否都等于0,只有满足条件的分组才会被完整保留。
方法二:通过sum()判断分组内降水总和是否为0
如果确认降水值均为非负数(符合实际气象数据逻辑),也可以通过判断分组内降水总和是否为0来筛选:
df %>% group_by(week) %>% filter(sum(precipitation) == 0) %>% ungroup()
- 这种方式和方法一效果一致,适合数据无负降水值的场景。
注意事项
- 原代码中
precipitation=="0"使用了字符串比较,但示例数据中precipitation是数值型,直接用precipitation == 0更准确,避免类型不匹配导致的错误。 - 筛选完成后如果不需要保留分组状态,建议添加
ungroup(),防止后续数据操作出现分组相关的意外问题。
内容的提问来源于stack exchange,提问作者Ahsk
相关产品推荐
相关产品推荐

