我正在尝试使用ifelse
或tidyquant
创建一个简单的dplyr
语句。
我目前拥有的是
from <- "2017-07-09"
to <- "2018-12-01"
getSymbols("GOOG", from = from, to = to, src = "yahoo", adjust = TRUE)
colnames(GOOG) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted")
library(dplyr)
library(tidyquant)
GOOG %>%
mutate(Direction = ifelse(Close < Open, 1, 0))
哪个返回错误:
Error in UseMethod("mutate_") :
no applicable method for 'mutate_' applied to an object of class "c('xts', 'zoo')"
我知道tidyquant
包可以对dplyr
数据使用xts
函数,所以我也试图使用tidyquant
来解决此问题。
以下方法有效,但是将数据取为xts
格式。
x <- GOOG %>%
data.frame() %>%
mutate(Direction = ifelse(Close < Open, 1, 0))
答案 0 :(得分:2)
这里的问题与ifelse
无关。关于mutate
和事实
class(GOOG)
# [1] "xts" "zoo"
在这种情况下,您无论如何都不会从mutate
获得任何收益,因此您可以使用
GOOG$Direction <- with(GOOG, ifelse(Close < Open, 1, 0))
但是,您也可以使用tidyquant
代替quantmod
和getSymbols
:
GOOG <- tq_get("GOOG", from = from, to = to)
GOOG %>% mutate(Direction = ifelse(close < open, 1, 0))
# A tibble: 354 x 8
# date open high low close volume adjusted Direction
# <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 2017-07-10 922. 930. 920. 929. 1192800 929. 0
# 2 2017-07-11 930. 931. 922 930. 1113200 930. 0
# 3 2017-07-12 939. 946. 934. 944. 1532100 944. 0
# ... with 351 more rows
然后可以这样做,因为
class(GOOG)
# [1] "tbl_df" "tbl" "data.frame"
另一种选择是继续使用quantmod
,但将mutate
替换为transform
:
GOOG %>% transform(Direction = ifelse(Close < Open, 1, 0))