使用 map / ifelse / when 使用嵌入式 xts objects 进行 R purrr 数据操作
R purrr data manipulation with embedded xts objects using map / ifelse / when
在嵌入 xts 的小标题下方 objects
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)))
看起来像这样:
现在我想创建一个新列,其中只有那些超过 10000 天的 xts objects。
Stock_Data <- Stock_Data %>%
dplyr::mutate(Price_If = map(Price_Data, ~ifelse(ndays(.x) > 10000,
.x,
NA)))
我已经尝试了上面的方法,但得到一个只包含一个数字的列表,当条件为 TRUE 时,它应该是整个 xts object,见下文:
随后尝试使用 when & map2
Stock_Data <- Stock_Data %>%
dplyr::mutate(Price_If = map2(Price_Data,Price_2016, ~when(ndays(.x) > 10000 ~ .x,
ndays(.x) <= 10000 ~ .y)))
得到这个结果:
如何找到正确的解决方案以及 ifelse 的实际情况以及应该返回 .x 的情况?
您的问题由两部分组成;让我们分别看看它们:
1) ifelse
ifelse
仅适用于 "simple" 值,如向量。您不能将它用于 return 更复杂的对象。另请参阅已证明日期意外行为的记录示例。但是你可以像这样使用 "normal" if-else
块:
Stock_Data %>%
dplyr::mutate(Price_If = map(Price_Data, ~if(ndays(.x) > 10000) .x else NA))
这会导致与您使用 map2
的方法类似的结果。
2) 仅提取一组观察结果
恐怕您无法使用 mutate
提取一组观察结果(行)。 mutate
添加或更改 列 ,因此结果将始终包括所有观察值/行。要过滤观察结果,请使用 dplyr
中的 filter
函数,如下所示:(在使用 mutate
创建 n_days
列之后)
Stock_Data %>%
dplyr::filter(n_days > 10000)
在嵌入 xts 的小标题下方 objects
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)))
看起来像这样:
现在我想创建一个新列,其中只有那些超过 10000 天的 xts objects。
Stock_Data <- Stock_Data %>%
dplyr::mutate(Price_If = map(Price_Data, ~ifelse(ndays(.x) > 10000,
.x,
NA)))
我已经尝试了上面的方法,但得到一个只包含一个数字的列表,当条件为 TRUE 时,它应该是整个 xts object,见下文:
随后尝试使用 when & map2
Stock_Data <- Stock_Data %>%
dplyr::mutate(Price_If = map2(Price_Data,Price_2016, ~when(ndays(.x) > 10000 ~ .x,
ndays(.x) <= 10000 ~ .y)))
得到这个结果:
如何找到正确的解决方案以及 ifelse 的实际情况以及应该返回 .x 的情况?
您的问题由两部分组成;让我们分别看看它们:
1) ifelse
ifelse
仅适用于 "simple" 值,如向量。您不能将它用于 return 更复杂的对象。另请参阅已证明日期意外行为的记录示例。但是你可以像这样使用 "normal" if-else
块:
Stock_Data %>%
dplyr::mutate(Price_If = map(Price_Data, ~if(ndays(.x) > 10000) .x else NA))
这会导致与您使用 map2
的方法类似的结果。
2) 仅提取一组观察结果
恐怕您无法使用 mutate
提取一组观察结果(行)。 mutate
添加或更改 列 ,因此结果将始终包括所有观察值/行。要过滤观察结果,请使用 dplyr
中的 filter
函数,如下所示:(在使用 mutate
创建 n_days
列之后)
Stock_Data %>%
dplyr::filter(n_days > 10000)