如何基于温度列表条件,对换热系数列表应用指定函数生成新列表?
实现对应元素的条件式计算方法
需求说明
我们有两个大型列表(各包含10+元素,以数据框形式存储):
list1:存储温度数据list2:存储换热系数数据
需要对list2的每个元素执行公式计算:(x*0.6/k),其中k值由list1对应位置的温度X按以下条件确定:
- 当
0 < X ≤ 20时,k = 0.02514 - 当
100 < X ≤ 200时,k = 0.03095 - 当
700 < X ≤ 800时,k = 0.07037
实现方案(R语言)
以下提供两种实现方式,分别基于tidyverse工具包和基础R函数,均可处理大型数据集:
方法1:使用tidyverse工具包(推荐,代码可读性高)
# 加载依赖包 library(dplyr) library(purrr) # 示例数据 list1_element1 <- data.frame("0" = c(20, 150, 120), "10" = c(20, 800, 120)) list2_element2 <- data.frame("0" = c(8, 10, 6), "10" = c(10, 9, 8)) # 定义计算函数 calc_value <- function(x_temp, x_h) { k <- case_when( x_temp > 0 & x_temp <= 20 ~ 0.02514, x_temp > 100 & x_temp <= 200 ~ 0.03095, x_temp > 700 & x_temp <= 800 ~ 0.07037 # 若需处理其他温度区间,可在此补充条件或默认值 ) round(x_h * 0.6 / k, 2) } # 对两个数据框的对应元素逐列、逐行计算 list3_element1 <- map2_dfc(list1_element1, list2_element2, ~map2_dbl(.x, .y, calc_value)) # 输出结果 list3_element1
运行后得到的结果与预期一致:
0 10 1 190.93 238.66 2 193.86 76.73 3 116.31 155.08
方法2:基础R实现(无需额外包)
# 示例数据 list1_element1 <- data.frame("0" = c(20, 150, 120), "10" = c(20, 800, 120)) list2_element2 <- data.frame("0" = c(8, 10, 6), "10" = c(10, 9, 8)) # 定义计算函数 calc_value_base <- function(x_temp, x_h) { k <- ifelse(x_temp > 0 & x_temp <= 20, 0.02514, ifelse(x_temp > 100 & x_temp <= 200, 0.03095, ifelse(x_temp > 700 & x_temp <= 800, 0.07037, NA))) round(x_h * 0.6 / k, 2) } # 逐元素计算并转为数据框 list3_element1_base <- as.data.frame( mapply(function(col1, col2) mapply(calc_value_base, col1, col2), list1_element1, list2_element2) ) # 输出结果 list3_element1_base
注意事项
- 若
list1中存在不在指定区间的温度值,上述代码会返回NA,可根据实际需求补充默认k值或异常处理逻辑 - 结果保留两位小数,可通过调整
round()函数的第二个参数修改精度 - 对于超大型数据集,tidyverse方法的执行效率更优
内容的提问来源于stack exchange,提问作者Raquel Feltrin
相关产品推荐
相关产品推荐

