【发布时间】: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 并行化......