在R语言bioRad包中使用sunrise函数时时区定义报错
解决bioRad::sunrise函数时区无效的问题
问题出在bioRad::sunrise函数的tz参数不支持传入向量,它要求单个时区字符串,但你用tz_lookup_coords得到的是每行对应的时区向量,直接传入就会触发"时区值无效"的错误。
要解决这个问题,需要逐行处理数据,把每行对应的日期、经纬度和时区单独传入sunrise函数。这里推荐两种实现方式:
方法一:用purrr包的向量化工具
# 加载所需包 library(lutz) library(bioRad) library(purrr) # 创建dataframe data <- data.frame(id = 1:10, date = c("2018-02-05", "2018-12-29", "2018-05-25", "2018-02-19", "2017-02-09", "2017-10-05", "2018-02-18", "2017-11-27", "2017-10-13", "2018-12-03"), wgs_x = c(-105.12782, -73.70111, -119.89776, -157.94036, -85.62744, -87.73867, -90.03440 , -97.39539, -112.34498, -83.06242), wgs_y = c(39.98948, 41.03264, 36.84011, 21.33720, 42.88368, 30.42648, 35.20090, 27.68490, 34.62111, 42.39886)) data$date <- as.Date(data$date) # 定义时区 data$timezone <- tz_lookup_coords(data$wgs_y, data$wgs_x, method = "accurate", warn = F) # 逐行计算日出时间 data$sunrise <- pmap(data[c("date", "wgs_x", "wgs_y", "timezone")], function(date, wgs_x, wgs_y, timezone) { sunrise(date = date, lon = wgs_x, lat = wgs_y, tz = timezone) }) # 可选:将列表结果转为统一的POSIXct格式 data$sunrise <- do.call(c, data$sunrise)
方法二:用基础R的apply函数
# 加载所需包 library(lutz) library(bioRad) # 创建dataframe(同上,省略重复代码) data <- data.frame(id = 1:10, date = c("2018-02-05", "2018-12-29", "2018-05-25", "2018-02-19", "2017-02-09", "2017-10-05", "2018-02-18", "2017-11-27", "2017-10-13", "2018-12-03"), wgs_x = c(-105.12782, -73.70111, -119.89776, -157.94036, -85.62744, -87.73867, -90.03440 , -97.39539, -112.34498, -83.06242), wgs_y = c(39.98948, 41.03264, 36.84011, 21.33720, 42.88368, 30.42648, 35.20090, 27.68490, 34.62111, 42.39886)) data$date <- as.Date(data$date) # 定义时区 data$timezone <- tz_lookup_coords(data$wgs_y, data$wgs_x, method = "accurate", warn = F) # 逐行计算日出时间 data$sunrise <- apply(data, 1, function(row) { sunrise(date = as.Date(row["date"]), lon = as.numeric(row["wgs_x"]), lat = as.numeric(row["wgs_y"]), tz = row["timezone"]) })
两种方法都能确保每行对应的时区被正确传入sunrise函数,避免时区无效的错误。
内容的提问来源于stack exchange,提问作者Nicole
相关产品推荐
相关产品推荐

