【问题标题】:Apply list of functions to one matrix simultaneously同时将函数列表应用于一个矩阵
【发布时间】:2019-09-23 21:44:20
【问题描述】:

我有一个矩阵/数据框,即 10 列和 1.000.000 行。现在我想在这个矩阵上应用 20 个不同的函数并存储结果。每个函数都像

df %>%  group_by(`column1`, `column2`, `column3`, `column4`) %>% filter (n()>20 )

在那个函数之后,我想把这个矩阵/数据框保存到一个列表中,所以应该有一个包含 20 个不同矩阵/数据框的列表。

我循环执行此操作,但这真的很慢。我对apply 做了一些尝试,但无法真正弄清楚我想念什么。 我的实际尝试是:

apply(X=df,MARGIN=c(1,2),FUN=function(df) df %>%  group_by(`column1`, `column2`, `column3`, `column4`) %>% filter (n()>20 ))

它给出了一个错误:

UseMethod("group_by_") 中的错误: 没有适用于“字符”类对象的“group_by_”方法

我能闻到我离解决方案不远了。能给我一个提示吗?

感谢和问候

【问题讨论】:

  • 请注意apply 使用for 循环,因此您不会使用此函数获得任何明显的加速。另外,apply 适用于矩阵,因此如果您有一个带有任何字符向量的 data.frame,apply 将构建一个字符矩阵并尝试对其进行处理。矩阵和 data.frames 是非常不同的对象。
  • 请显示for循环版本。
  • @lmo 如果我循环例如一列并将每个值乘以 2,则循环比应用函数慢 1000 倍,后者将整个向量乘以 2。在家里我会尝试来自 slava-kohut 的解决方案并发布我的示例代码
  • 如果它慢 1000 倍,那么你正在做一些奇怪的事情,比如增加一个值向量。如果您所做的只是将向量乘以 2,则可以使用 myVec2 <- myVec * 2,因为此操作在 R 中是向量化的。
  • 是的,这只是一个例子。我认为没有办法对矩阵进行 300 次矢量化分组,如果我做对了,它必须循​​环。然后我会保持原样,使用它的 cpu 并行化......

标签: r apply


【解决方案1】:

这是一个例子。这里,funs 包含要应用的函数的名称,ml 是结果列表。希望这能给你足够的提示来实现你想要的。如果您在特定问题上需要帮助,请提供一些数据。

funs <- c("sqrt", "log", "exp")

m <- matrix(runif(1.e4), 100, 100)

am <- function(f, m){
  apply(m, MARGIN = 1:2, match.fun(f))
}

ml <- lapply(funs, am, m = m)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2015-05-08
    • 2021-10-19
    • 2019-04-05
    • 2020-05-30
    • 1970-01-01
    相关资源
    最近更新 更多