如何在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
相关产品推荐
相关产品推荐

