英文:
Trying to create a date column for tibble. Want to take the values from the index of a prices xts obkect
问题
我首先遇到的错误是在索引(.)))行。对象'.'未找到。当我将'.'放入索引行时,我在spread(asset, return)中遇到错误,错误信息是每行输出必须由唯一键组合标识。请查找代码和spread错误:
# 将每日价格转换为整洁数据框中的月度回报率
asset_returns_dplyr <-
prices %>%
to.monthly(indexAt = "lastof", OHLC = FALSE) %>%
# 将索引转换为日期
data.frame(date = index(.)) %>%
# 现在删除索引,因为它被转换为行名称
remove_rownames() %>%
gather(asset, prices, -date) %>%
group_by(asset) %>%
mutate(returns = (log(prices) - log(lag(prices)))) %>%
select(-prices) %>%
spread(asset, returns) %>%
select(date, symbols) %>%
na.omit()
错误信息在spread()
中:
! 每行输出必须由唯一组合的键标识。
ℹ 键被共享了 625 行
• 501、502、503、504、505、506、507、508、509、510、511、512、513、514、515、516、517、
518、519、520、521、522、523、524、525、526、527、528、529、530、531、532、533、534、535、536、537、538、539、540、541、542、543、544、
545、546、547、548、549、550、551、552、553、554、555、556、557、558、559、560、561、562、
结构(c(117.827011108398, 120.846908569336, 120.57389831543,
121.103385925293, 120.772438049316, 120.424964904785,
120.73104095459,
121.690849304199, 121.682556152344, 121.59984588623,
42.5093727111816,
43.1672821044922, 42.7486114501953, 42.9654159545898,
42.7785224914551,
42.5392799377441, 42.7560882568359, 43.3018455505371,
43.3915596008301,
43.4438934326172, 34.7362937927246, 35.6893730163574,
35.6421546936035,
35.9212112426758, 35.7108459472656, 35.5734710693359,
35.6765060424805,
35.7194404602051, 35.693675994873, 35.6850929260254,
35.7743263244629,
36.4761009216309, 36.2179832458496, 36.2905693054199,
36.0163269042969,
35.6936645507812, 35.8469200134277, 36.1615180969238,
35.8711166381836,
36.0243835449219, 86.7947540283203, 86.6931762695312,
86.4743957519531,
86.5681304931641, 86.5212860107422, 86.5993957519531,
86.5369033813477,
86.5290603637695, 86.6150131225586, 86.6931762695312), class =
c("xts",
"zoo"), src = "yahoo", updated = structure(1685658877.66735, class
= c("POSIXct",
"POSIXt")), index = structure(c(1356912000, 1357084800, 1357171200,
1357257600, 1357516800, 1357603200, 1357689600, 1357776000,
1357862400,
1358121600), tzone = "UTC", tclass = "Date"), dim = c(10L, 5L
), dimnames = list(NULL, c("SPY", "EFA", "IJS", "EEM", "AGG")))
<details>
<summary>英文:</summary>
The first error I get is from the index(.))) line. Which is object '.' not found. When I put '.' into the index line I get an error in the spread(asset, return), which is Each row of output must be identified by a unique combination of keys. Please find code and spread error:
# Converting Daily Prices to Monthly Returns in the tidyverse
asset_returns_dplyr =
prices |>
to.monthly(indexAt = "lastof", OHLC = FALSE) |>
# convert the index to a date
data.frame(date = index(.)) |>
# now remove the index because it got converted to row names
remove_rownames() |>
gather(asset, prices, -date) |>
group_by(asset) |>
mutate(returns = (log(prices) - log(lag(prices)))) |>
select(-prices) |>
spread(asset, returns) |>
select(date, symbols)
na.omit()
Error in `spread()`:
! Each row of output must be identified by a unique combination of keys.
ℹ Keys are shared for 625 rows
• 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517,
518, 519, 520, 521, 522,
523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 5
540, 541, 542, 543, 544,
545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561,
562,
structure(c(117.827011108398, 120.846908569336, 120.57389831543,
121.103385925293, 120.772438049316, 120.424964904785,
120.73104095459,
121.690849304199, 121.682556152344, 121.59984588623,
42.5093727111816,
43.1672821044922, 42.7486114501953, 42.9654159545898,
42.7785224914551,
42.5392799377441, 42.7560882568359, 43.3018455505371,
43.3915596008301,
43.4438934326172, 34.7362937927246, 35.6893730163574,
35.6421546936035,
35.9212112426758, 35.7108459472656, 35.5734710693359,
35.6765060424805,
35.7194404602051, 35.693675994873, 35.6850929260254,
35.7743263244629,
36.4761009216309, 36.2179832458496, 36.2905693054199,
36.0163269042969,
35.6936645507812, 35.8469200134277, 36.1615180969238,
35.8711166381836,
36.0243835449219, 86.7947540283203, 86.6931762695312,
86.4743957519531,
86.5681304931641, 86.5212860107422, 86.5993957519531,
86.5369033813477,
86.5290603637695, 86.6150131225586, 86.6931762695312), class =
c("xts",
"zoo"), src = "yahoo", updated = structure(1685658877.66735, class
= c("POSIXct",
"POSIXt")), index = structure(c(1356912000, 1357084800, 1357171200,
1357257600, 1357516800, 1357603200, 1357689600, 1357776000,
1357862400,
1358121600), tzone = "UTC", tclass = "Date"), dim = c(10L, 5L
), dimnames = list(NULL, c("SPY", "EFA", "IJS", "EEM", "AGG")))
</details>
# 答案1
**得分**: 1
这里存在几个问题:
- 在 Stack Overflow 发布的代码应该是完整的。缺少了 `library` 语句。
- `spread` 和 `gather` 通常不再使用,而应改为使用 tidyr 中的 `pivot_wider` 和 `pivot_longer`。
- `dot` 不能与 `|>` 一起使用,只能与 `%>%` 一起使用。
- 通过不转换为数据框架并使用 `diff.xts` 可以显著简化代码。
以下是修改后的代码示例:
```R
library(quantmod) # 同时引入了 zoo 和 xts
rets <- prices |>
to.monthly(indexAt = "lastof", OHLC = FALSE) |>
diff(log = TRUE)
rets
## SPY EFA IJS EEM AGG
## 2013-01-31 0.03151816 0.02174571 0.02694797 0.006965536 -0.001171007
如果你确实想将 xts 对象转换为数据框架,可以使用 fortify.zoo
。例如:
rets |>
fortify.zoo(name = "date")
## date SPY EFA IJS EEM AGG
## 1 2012-12-31 NA NA NA NA NA
## 2 2013-01-31 0.03151816 0.02174571 0.02694797 0.006965536 -0.001171007
希望这些修改能够帮助你解决问题。
英文:
There are several problems here:
- code posted to SO should be complete. The
library
statement(s) are missing. spread
andgather
are normally no longer used andpivot_wider
andpivot_longer
from tidyr are used instead.- dot cannot be used with |>, only with %>% .
- the code can be simplified significantly by not converting to data frame and using
diff.xts
This gives
library(quantmod) # also pulls in zoo and xts
rets <- prices |>
to.monthly(indexAt = "lastof", OHLC = FALSE) |>
diff(log = TRUE)
rets
## SPY EFA IJS EEM AGG
## 2013-01-31 0.03151816 0.02174571 0.02694797 0.006965536 -0.001171007
If you did want to convert an xts object to a data frame use fortify.zoo
. For example:
rets |>
fortify.zoo(name = "date")
## date SPY EFA IJS EEM AGG
## 1 2012-12-31 NA NA NA NA NA
## 2 2013-01-31 0.03151816 0.02174571 0.02694797 0.006965536 -0.001171007
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论