计算tsibble各序列均值遇colMeans报错,求原因及替代方案
tsibble计算列均值报错及解决方法
问题场景
用户尝试计算tsibble对象中各序列的均值,编写了如下R代码:
library(tsibble) data <- tibble( Time = seq(as.Date("2020-01-01"), by = "1 months", length.out = 4), Series1 = c(3, 4, 1, 2), Series2 = c(0, 1, 2, 3) ) ts <- as_tsibble(data, index = Time) print(ts) print(colMeans(ts))
运行后触发报错:
Error in colMeans(ts) : 'x' must be numeric
且对原始tibble调用colMeans()时也出现相同错误。用户疑问:
- 为何tsibble未重载
colMeans()以自动忽略日期索引列? - 有哪些可行的替代方法计算数值列的均值?
(环境:R 4.0.4,tsibble 1.1.4)
原因解释
colMeans()是base R的函数,要求输入对象的所有列必须是数值类型。tsibble继承自tibble,两者都没有重载colMeans()来自动过滤非数值列——这并非tsibble的设计疏漏,而是因为这类通用数据框列统计不属于tsibble专注的时间序列核心功能范畴。base R的基础函数更强调输入类型的严格性,不会自动推断并过滤非目标类型列。
替代方法
方法1:筛选数值列后调用colMeans
利用dplyr::select()结合where(is.numeric)筛选出所有数值列,再传入colMeans():
library(dplyr) colMeans(select(ts, where(is.numeric)))
方法2:用dplyr的summarise+across实现更灵活的统计
适配tsibble/tibble生态,支持同时对多列执行统计操作,还可添加na.rm = TRUE处理缺失值:
ts %>% summarise(across(where(is.numeric), mean, na.rm = TRUE))
方法3:转换为数据框后筛选数值列
将tsibble转换为普通数据框,再通过逻辑索引筛选数值列(相对前两种方法不够简洁):
colMeans(as.data.frame(ts)[, sapply(ts, is.numeric)])
内容的提问来源于stack exchange,提问作者Robert Pollak
相关产品推荐
相关产品推荐

