首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用map / ifelse / when使用嵌入式xts对象提供数据操作

使用map / ifelse / when使用嵌入式xts对象提供数据操作
EN

Stack Overflow用户
提问于 2017-04-24 03:51:47
回答 1查看 763关注 0票数 2

在带有嵌入xts对象的Ti球下面

代码语言:javascript
运行
复制
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对象的新列。

代码语言:javascript
运行
复制
Stock_Data <- Stock_Data %>% 
dplyr::mutate(Price_If = map(Price_Data,  ~ifelse(ndays(.x) > 10000,
                                                          .x,
                                                          NA)))

我尝试过以上方法,但得到的列表中只有一个数字,条件为真时,它应该是整个xts对象,请参见下面的内容:

然后尝试使用when & map2

代码语言:javascript
运行
复制
Stock_Data <- Stock_Data %>% 
dplyr::mutate(Price_If = map2(Price_Data,Price_2016,  ~when(ndays(.x) > 10000 ~ .x, 
                                            ndays(.x) <= 10000 ~ .y)))

得到了这样的结果:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-24 06:28:22

你的问题由两部分组成,让我们分开来看:

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添加或更改列,因此结果总是包括所有的观察/行。若要筛选观测结果,请使用来自dplyrdplyr函数,如下所示:(在您创建了带有mutaten_days列之后)

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43579502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档