如何筛选多数据框中温度高于对应省份阈值的完整行?
问题:筛选各省份数据框中温度高于对应阈值的完整行子集
我是R语言和Stack Overflow新手,若格式或标题有误请见谅。我有一个名为climate的列表,包含20个对应各省份的data frame,每个data frame包含year、month、day、temperature等列。我希望筛选出温度高于对应省份阈值的行,但每个省份的阈值不同。我已用lapply计算出各省份的阈值,但用这些阈值筛选数据时输出结果异常,仅返回温度值且不符合条件,同时不知如何返回完整行。
示例数据代码
A <- data.frame("D" = c(1:30), "T" = c(sample(10:30, size = 30, replace = TRUE))) B <- data.frame("D" = c(1:30), "T" = c(sample(4:22, size = 30, replace = TRUE))) C <- data.frame("D" = c(1:30), "T" = c(sample(14:35, size = 30, replace = TRUE))) climate <- list("Alist" = A, "Blist" = B, "Clist" = C) climate
已完成的阈值计算代码
thresh95 <- lapply(lapply( climate, `[[`, 2), # 提取所有省份数据框的T列 quantile, probs = c(0.95), na.rm = TRUE) # 计算95分位数值 thresh95
问题筛选代码(异常)
tmax95 <- lapply(lapply(climate, `[[`, 2), # 提取所有省份数据框的T列 function(x) x[which(x>thresh95)])# 筛选高于阈值的温度值 tmax95
问题原因
- 筛选时先提取了
T列,导致只能返回温度值,无法保留完整行; thresh95是包含多个阈值的列表,直接用x>thresh95会将单个温度向量与整个列表比较,逻辑错误,导致结果不符合预期。
正确解决方案
方法1:基于已有阈值列表筛选(使用Map())
Map()可以同时遍历climate数据框列表和thresh95阈值列表,一一对应处理:
tmax95 <- Map(function(df, thresh) { # 筛选当前省份中T列大于对应阈值的完整行 df[df$T > thresh, ] }, climate, thresh95) # 查看结果 tmax95
方法2:阈值计算+筛选一步完成(更简洁高效)
无需单独生成阈值列表,直接在lapply中完成阈值计算和筛选:
tmax95 <- lapply(climate, function(df) { # 计算当前省份的95分位阈值 thresh <- quantile(df$T, probs = 0.95, na.rm = TRUE) # 筛选符合条件的完整行 df[df$T > thresh, ] }) # 查看结果 tmax95
结果说明
两种方法最终都会返回一个列表,每个元素对应原climate中的省份数据框,仅保留该省份温度高于自身95分位阈值的完整行数据。
内容的提问来源于stack exchange,提问作者user26711711
相关产品推荐
相关产品推荐

