使用map / ifelse /

时间:2017-04-24 03:51:48

标签: r xts purrr

下面是嵌入了xts对象的元素

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

随后尝试使用&amp; 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

我如何找到正确的解决方案以及ifelse&amp;什么时候应该返回.x

1 个答案:

答案 0 :(得分:3)

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

1)ifelse

ifelse仅适用于像矢量这样的“简单”值。您不能使用它来返回更复杂的对象。另请参阅已记录的示例,这些示例已经证明日期的意外行为但是你可以像这样使用“普通”if-else块:

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)