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

如何在R语言中实现tsibble列除以首值的操作?

解决tsibble对象列标准化(除以首值)的错误问题

之前处理xts对象时,用以下函数实现列除以首值的标准化:

standardize <- function(ts) { as.xts(apply(ts, 2, function(x) x / x[1])) }

但处理tsibble对象时,执行以下代码会报错:

require(fpp3)
goog <- gafa_stock %>% filter(Symbol=="GOOG",year(Date)==2018)
close <- goog %>% select(Close)
close1 <- apply(close, 2, function(x) x / x[1])

错误信息:

Error in x/x[1] : non-numeric argument to binary operator

问题原因

apply函数处理tsibble列时,会将列转换为tsibble的嵌套数据结构(而非纯数值向量),导致除法操作无法识别数值类型,触发错误。tsibble是基于tidyverse的时间序列对象,需要用tidy兼容的函数操作。

解决方案

使用tidyverse的dplyr函数直接操作,适配tsibble的结构:

单列处理

require(fpp3)
goog <- gafa_stock %>% filter(Symbol == "GOOG", year(Date) == 2018)
close <- goog %>% select(Close)
# 生成标准化后的新列
close_standardized <- close %>% mutate(Close_std = Close / first(Close))

多列批量处理

如果需要对多列执行标准化,用across()批量操作:

# 选择需要处理的多列
goog_multi <- gafa_stock %>% 
  filter(Symbol == "GOOG", year(Date) == 2018) %>% 
  select(Close, Volume)

# 批量生成标准化列,命名格式为原列名+_std
multi_standardized <- goog_multi %>% 
  mutate(across(everything(), ~ .x / first(.x), .names = "{.col}_std"))

说明

first()函数会提取列的第一个数值(tsibble默认按时间排序,首值即为时间序列的起始值),across()可以快速遍历所有目标列,完全适配tsibble的tidy数据结构,避免了类型转换问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:35:08