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

将oce包生成的矩阵转为DataFrame,保留POSIXct日期格式

解决oce包sunAngle转置后日期格式变为列表的问题

问题根源在于sunAngle函数返回的是包含多元素的列表,使用Vectorize后每行结果仍为列表,转置为矩阵时,矩阵元素存储的是列表对象,转换为DataFrame后自然形成列表列,而非原子向量格式的POSIXct日期。

以下是两种可行的解决方法:

方法一:直接逐行生成DataFrame(推荐)

使用purrr::pmap_dfr逐行处理输入数据,直接将sunAngle的返回结果绑定为DataFrame,避免矩阵转置带来的类型问题:

library(oce)
library(dplyr)
library(purrr)

df <- data.frame(times = as.POSIXct(rep("2011-03-03 06:49:00", 4)),
                 Latitude = c(39,38,34,35),
                 Longitude = c(-75,-74,-73,-72),
                 ref = rep(TRUE, 4))

# 逐行调用sunAngle并合并为DataFrame
Sun.Angle <- pmap_dfr(df, function(times, Latitude, Longitude, ref) {
  sunAngle(times, longitude = Longitude, latitude = Latitude, useRefraction = ref)
})

# 验证日期列类型
class(Sun.Angle$time)

此方法生成的Sun.Angle中,time列会保留原始的POSIXct格式,其他数值列也为正常的原子向量。

方法二:修复原有转置后的DataFrame

如果坚持使用原有的Vectorize+转置流程,需要手动提取列表列中的元素并转换为原子向量:

library(oce)
library(dplyr)

df <- data.frame(times = as.POSIXct(rep("2011-03-03 06:49:00", 4)),
                 Latitude = c(39,38,34,35),
                 Longitude = c(-75,-74,-73,-72),
                 ref = rep(TRUE, 4))

vsunAngle = Vectorize(sunAngle)
sun_matrix <- t(with(df, vsunAngle(times, longitude = Longitude, latitude = Latitude, useRefraction = ref)))

# 转换为DataFrame并处理各列
Sun.Angle <- as.data.frame(lapply(sun_matrix, function(col_list) {
  # 针对POSIXct类型保留格式,其他类型直接展开
  if (inherits(col_list[[1]], "POSIXct")) {
    do.call(c, col_list)
  } else {
    unlist(col_list)
  }
}))

# 验证日期列类型
class(Sun.Angle$time)

这里通过lapply遍历矩阵的每一列,将列表中的元素合并为原子向量:对于POSIXct类型,使用do.call(c, col_list)可以保留其日期格式;数值类型则直接用unlist展开。

内容的提问来源于stack exchange,提问作者roday

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:02:44