如何修复quantmod包for循环计算股票股息时的赋值错误
问题:R语言quantmod计算个股股息时for循环结果被覆盖的修复
需求说明
使用R语言的quantmod库getDividends()函数,从tibble类型的div_dummy数据中读取股票代码(symbol)和买入日期(date),计算每只股票2021年对应时段的股息总和,并写入year_2021列。
原始数据
div_dummy数据结构如下:
| symbol | shares | date | year_2021 | |
|---|---|---|---|---|
| 1 | ABT | 5.00 | 2022-02-18 | 5.894309 |
| 2 | ABBV | 5.00 | 2021-09-01 | 5.894309 |
| 3 | AAPL | 5.00 | 2021-04-30 | 5.894309 |
| 4 | KO | 5.00 | 2022-02-18 | 5.894309 |
| 5 | MDLZ | 5.00 | 2021-09-01 | 5.894309 |
| 6 | CRM | 5.00 | 2022-02-18 | 5.894309 |
原始代码
for (i in 1:nrow(div_dummy)) { symbol_dummy <- div_dummy[i,1] date_dummy <- div_dummy[i,3] div_dummy$year_2021 <- sum(getDividends(symbol_dummy, src = "yahoo", start = date_dummy, to = "2021-12-31")) }
问题现象
预期year_2021列会显示每只股票对应时段的股息总和,但实际该列所有值都是最后一只股票(CRM)的股息结果。
错误原因
原代码中每次循环执行div_dummy$year_2021 <- ...时,是给整个列赋值,而不是当前循环的第i行。因此每一次循环都会覆盖之前所有行的值,最终整个列只会保留最后一次循环的计算结果。
修复方案
方案1:修改for循环,指定行赋值
调整代码,将计算结果赋值给div_dummy$year_2021[i],即仅更新当前循环的行:
for (i in 1:nrow(div_dummy)) { # 提取当前行的股票代码和日期,避免tibble子集操作带来的结构问题 symbol_dummy <- div_dummy$symbol[i] date_dummy <- div_dummy$date[i] # 处理买入日期晚于2021年底的情况:此时2021年无股息,总和为0 if (date_dummy > as.Date("2021-12-31")) { div_dummy$year_2021[i] <- 0 } else { # 获取股息并求和,赋值给当前行的year_2021 divs <- getDividends(symbol_dummy, src = "yahoo", start = date_dummy, to = "2021-12-31") div_dummy$year_2021[i] <- sum(divs) } }
关键点说明:
- 直接用
div_dummy$symbol[i]和div_dummy$date[i]提取值,避免tibble子集操作带来的结构问题 - 增加日期判断:如果买入日期在2021年之后,该股票2021年不会产生股息,直接赋值0,减少不必要的API请求
方案2:使用dplyr行操作(更简洁高效)
如果习惯tidyverse风格,可以用rowwise()+mutate()实现,无需手动写for循环:
library(dplyr) library(quantmod) div_dummy <- div_dummy %>% rowwise() %>% mutate( year_2021 = if_else(date > as.Date("2021-12-31"), 0, sum(getDividends(symbol, src = "yahoo", start = date, to = "2021-12-31"))) ) %>% ungroup()
优势:代码更简洁,自动处理行迭代,无需手动管理循环索引。
内容的提问来源于stack exchange,提问作者salvo
相关产品推荐
相关产品推荐

