【问题标题】:How to convert 3650 columns (temperature) from Kelvin to Celsius?如何将 3650 列(温度)从开尔文转换为摄氏度?
【发布时间】:2025-12-14 01:10:01
【问题描述】:

我有一个包含 10 年每日温度数据的数据框。我想将所有值转换为摄氏度。所以我有 3.653 列和 500 行。

我的数据示例如下所示:

位置_ID day1_2010 day2_2010 day3_2010 day4_2010 -------------------------------------------------- ---------------- 1345 301 302 345 320 2375 305 302 345 320 3126 311 299 305 320

【问题讨论】:

标签: r dataframe temperature


【解决方案1】:

我们可以使用weathermetrics包中的kelvin.to.celsius(不需要知道转换因子)来进行转换。循环across 'day' 列并在列上应用函数,并通过分配回同一对象进行更新

library(dplyr)
library(weathermetrics)
df1 <- df1 %>%
    mutate(across(starts_with('day'), kelvin.to.celsius, round = 2))

-输出

df1
Location_ID day1_2010 day2_2010 day3_2010 day4_2010
1        1345     27.85     28.85     71.85     46.85
2        2375     31.85     28.85     71.85     46.85
3        3126     37.85     25.85     31.85     46.85

如果数据很大,或者使用collapse

library(collapse)
get_vars(df1, regex =TRUE, vars = '^day') <- dapply(get_vars(df1, 
      regex =TRUE, vars = '^day'), MARGIN = 2, kelvin.to.celsius) 

数据

df1 <- structure(list(Location_ID = c(1345L, 2375L, 3126L), day1_2010 = c(301L, 
305L, 311L), day2_2010 = c(302L, 302L, 299L), day3_2010 = c(345L, 
345L, 305L), day4_2010 = c(320L, 320L, 320L)),
 class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

    【解决方案2】:

    只需从除 ID 列 273.15 之外的所有列中减去。

    DF[-1] <- DF[-1] - 273.15
    DF
    #   Location_ID day1_2010 day2_2010 day3_2010 day4_2010
    # 1        1345     27.85     28.85     71.85     46.85
    # 2        2375     31.85     28.85     71.85     46.85
    # 3        3126     37.85     25.85     31.85     46.85
    

    数据

    DF <- structure(list(Location_ID = c(1345L, 2375L, 3126L), day1_2010 = c(301L, 
    305L, 311L), day2_2010 = c(302L, 302L, 299L), day3_2010 = c(345L, 
    345L, 305L), day4_2010 = c(320L, 320L, 320L)), class = "data.frame", row.names = c(NA, 
    -3L))
    

    【讨论】:

    • 非常感谢。我对此很陌生。这个解决方案太简单了!
    • @mgdata 非常欢迎!我建议您更详细地研究 R 的向量化。
    • 谢谢!我会这样做的。
    【解决方案3】:

    tidyverse 方法,您可以在其中定义自己的函数

    library(dplyr)
    
    your_data_frame %>%
      mutate(across(.cols = starts_with('day'),.fns = function(x) x - 273.15))
    
    Location_ID day1_2010 day2_2010 day3_2010 day4_2010
    1        1345     27.85     28.85     71.85     46.85
    2        2375     31.85     28.85     71.85     46.85
    3        3126     37.85     25.85     31.85     46.85
    

    【讨论】: