如何将短于dataframe行数的向量赋值给dataframe列(股票收益率场景)
你计算得到的收益率向量长度为n-1,直接赋值给长度为n的整列时会触发长度不匹配的报错。你提前将returns列初始化为全NA的操作是正确的,只需要调整赋值时的行范围,让左右两边长度匹配即可。
基础R修正方案
dframe$returns <- NA # 注意:R中获取数据框行数的函数为nrow(),原代码的nrows()是拼写错误 n <- nrow(dframe) # 仅给第2行到第n行的returns列赋值,和计算得到的n-1个收益率长度匹配 dframe$returns[2:n] <- (dframe$adj.price[2:n] - dframe$adj.price[1:(n-1)]) / dframe$adj.price[1:(n-1)]
也可以用内置函数简化写法,避免手动索引出错:
dframe$returns <- NA # diff()直接计算后项减前项得到n-1个差值,head(,-1)取除最后一个元素外的所有价格 dframe$returns[-1] <- diff(dframe$adj.price) / head(dframe$adj.price, -1)
dplyr便捷方案
如果使用tidyverse生态的dplyr包,可通过lag()函数自动处理时序偏移,无需手动处理索引:
library(dplyr) dframe <- dframe %>% mutate(returns = (adj.price - lag(adj.price)) / lag(adj.price))
lag(adj.price)会自动取当前行上一行的adj.price值,第一行无上游数据时自动返回NA,完全符合收益率的计算逻辑。
注意:操作前请确保数据已经按时间升序排列,否则会出现时序错乱,得到错误的收益率结果。
内容的提问来源于stack exchange,提问作者thomas.diridondo
相关产品推荐
相关产品推荐

