【问题标题】:alternative to `lapply` when applying function across columns跨列应用函数时替代“lapply”
【发布时间】:2019-09-26 20:30:22
【问题描述】:

跨数据框列应用函数的正确方法是什么?

我有一些类似以下的数据:

我想为每一列计算一个简单的移动平均值。我可以使用lapply,但它会将数据作为列表,如果可能的话,我想创建新列或新数据框。

我尝试过sapplymapply 等。

数据:

require(quantmod)
require(PerformanceAnalytics)
library(data.table)


from <- "2017-01-01"
to <- "2018-12-01"

symbols <- c('GOOG', 'MSFT', 'AAPL')

dataEnv <- new.env()
getSymbols(symbols, from=from, to = to, src = "yahoo", adjust = TRUE, env = dataEnv) 

data <- do.call(merge, eapply(dataEnv, Ad))
colnames(data) <- gsub(".Adjusted", "", colnames(data))

x <- lapply(data, function(x) SMA(x, n = 10))

例如,这会创建一个新列:

data$googleSMA &lt;- SMA(data$GOOG)

【问题讨论】:

  • 如果你使用lapply,你可以使用df[] &lt;- lapply(df, yourfunction)
  • 使用它创建一个包含 1449 个观察值的列表
  • data[] &lt;- lapply(data, function(x) SMA(x, n = 10))
  • 抱歉!不需要quantstrat 包!我现在将使用所需的唯一软件包编辑原始帖子。
  • 好的,添加了必要的包,quantmod 包用于从 Yahoo Finance 获取数据,PerformanceAnalytics 用于计算 SMAdata.table 用于计算 do.call(merge, eapply(dataEnv, Ad))(我认为)。

标签: r


【解决方案1】:

这是一个xts 对象。 lapply 适用于 data.framelist。在这里,我们可以使用apply

apply(data, 2, SMA, n = 10)

【讨论】:

  • 啊!我正在尝试这个(但是没有2)。 2 在这里做什么?因为我错过了这部分。
  • @user8959427 这是MARGIN 2 - 用于列,1 - 用于行
猜你喜欢
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 2019-07-08
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多