You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选多数据框中温度高于对应省份阈值的完整行?

问题:筛选各省份数据框中温度高于对应阈值的完整行子集

我是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

问题原因

  1. 筛选时先提取了T列,导致只能返回温度值,无法保留完整行;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:42:44