用特定列的条件替换值

Replace values with conditions over specific columns

我尝试将其自动化并四处搜索,但没有结果。我从雅虎财经下载了以下数据。

require(quantmod)

tickers <- c("SPY")
start <- "2020-01-01"
end   <- "2020-06-01"

 getSymbols(tickers,
             from = start,
             to = end,
             env = globalenv())

现在,如果 index(data) 在“2020-05-01”之前,我想替换 SPY$openSPY$close、... 中的所有值。我尝试使用 xts 格式,但我做不到,所以我决定通过以下方式将其转换为 data.frame:

data = SPY # I create this so I can scale up the code for not only SPY.

data$day <- as.Date(data$day) # format day.
colnames(data) <- c("day", "open", "high", "low", "close", "volume", "adjusted_price")
to_replace <- c("day", "open", "high", "low", "close", "volume", "adjusted_price")

现在,我可以运行为一列编写以下代码

  data$open <- ifelse(data$day < as.Date("2020-05-01"), data$open/100, data$open)

如何为 to_replace 中命名的所有列制作自动代码 运行。我尝试创建一个函数并像这样应用 lapply 但它没有用。

  replace <- function(x) {
    x <- ifelse(data$day > as.Date("2020-05-1"), x/100, x)
    return(x)
  }

lappy(tickers, replace)

总的来说,我有两个问题。

  1. 我们如何 运行 在某些条件下对多个列的值进行函数处理?
  2. 我们可以在 xts 帧而不是数据帧中完成所有这些吗?

您可以尝试使用 dplyr 1.0.0 中的 across:

library(dplyr)

data <- data.frame(date=index(SPY), coredata(SPY))

colnames(data) <- c("day", "open", "high", "low", "close", "volume", "adjusted_price")
to_replace <- c("open", "high", "low", "close", "volume", "adjusted_price")

data <- data %>% 
  mutate(across(to_replace, ~ if_else(day >  as.Date("2020-05-1"), . / 100, .)))