使用 map/ifelse/when 嵌入 xts 对象的 R purrr 数据操作

标签 r xts purrr

在带有嵌入 xts 对象的 tibble 下方

library(quantmod)
library(tidyverse)

Tickers <- c("AAPL","JNJ","KO","NKE")
Stock_Data <- sapply(Tickers, function(x) getSymbols(x,
from="1970-01-01",auto.assign = FALSE),
                 USE.NAMES = TRUE, simplify = FALSE) %>% 
 enframe(name="Ticker",value="Price_Data") %>% 
 dplyr::mutate(Price_2016 = map(Price_Data,function(x) x['2016'])) %>% 
 dplyr::mutate(n_days = map_dbl(Price_Data, function(x) ndays(x)))

看起来像这样: enter image description here

现在我想创建一个新列,其中仅包含那些超过 10000 天的 xts 对象。

Stock_Data <- Stock_Data %>% 
dplyr::mutate(Price_If = map(Price_Data,  ~ifelse(ndays(.x) > 10000,
                                                          .x,
                                                          NA)))

我已经尝试过上述方法,但得到一个仅包含一个数字的列表,当条件为 TRUE 时,它应该是整个 xts 对象,请参见下文: enter image description here

然后尝试使用when & map2

Stock_Data <- Stock_Data %>% 
dplyr::mutate(Price_If = map2(Price_Data,Price_2016,  ~when(ndays(.x) > 10000 ~ .x, 
                                            ndays(.x) <= 10000 ~ .y)))

得到了这个结果:

enter image description here

对于应该返回 .x 的情况,如何找到正确的解决方案以及 ifelse 和 when 实际发生了什么?

最佳答案

您的问题由两部分组成;让我们分别看看它们:

1) ifelse

ifelse只适用于“简单”值,例如向量。您不能使用它来返回更复杂的对象。另请参阅已记录的示例,这些示例已经演示了日期的意外行为。但是你可以只使用“正常”if-else像这样的 block :

Stock_Data %>% dplyr::mutate(Price_If = map(Price_Data, ~if(ndays(.x) > 10000) .x else NA))

这会导致与 map2 的方法类似的结果.

2)仅提取一组观察结果

恐怕您无法使用 mutate 提取一组观察结果(行) 。 mutate添加或更改,因此结果将始终包含所有观察结果/行。要过滤观察结果,请使用 filter来自 dplyr 的函数像这样:(在您使用 n_days 创建 mutate 列之后)

Stock_Data %>% dplyr::filter(n_days > 10000)

关于使用 map/ifelse/when 嵌入 xts 对象的 R purrr 数据操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43579502/

相关文章:

r - 如何使用 purrr 中的 map 和 dplyr::mutate 根据列对创建多个新列

r - 使用gtummary通过一行代码功能创建多个交叉表

r - R中多个图的通用图例

不等式条件的滚动总和

r - 在 r 中按组选择第二大行

r - 处理 R 中 xts 对象的应用函数

r - 在 R 中进行主成分分析时,如何判断是否首先标准化数据矩阵更好?

r - 如何找到股票盘中高点和低点之间耗时?

r - 使用 R 中的 xts 获取每周的第一天和最后一天

重命名数据框列表中的所有列