【发布时间】:2017-04-13 03:35:49
【问题描述】:
我正在尝试优化 r 中的循环,该循环计算关于数据帧中每一行的向量中每个元素的字符串匹配数。在小型数据集中它工作得很好(约 15 分钟;11 列,914 行)。但是,在庞大的数据集(914 列,18.000 行)中运行需要几天时间。这是我非常基本的循环:
for (j in 1: dim(pddbnh)[1]){
for (i in 1:dim(pidf)[1]){
richa[i,j] <- length(pidf[i,][pidf[i,] == row.names(pddbnh)[j] ])
}
}
我想知道是否有人知道如何使用其他方法(例如矢量化)优化此循环。任何解决方案将不胜感激!
更新 这是一个小数据集。这是最快的一个
df<-data.frame(replicate(10,sample(c("sp1", "sp2"),10,rep=TRUE)))
vec<-c("sp1", "sp2")
richa <- data.frame()
for (j in 1:length(vec)){
for (i in 1:dim(df)[1]){
richa[i,j] <- length(df[i,][df[i,] == vec[j] ])
}
}
【问题讨论】:
-
是的,我可能知道该怎么做。请提供一个最小的可重现示例进行测试。
-
(显然你还没有彻底搜索 SO,因为有很多关于提高 for 循环性能的 Q&A。)要求
[处理[ pidf[i,] == row.names(pddbnh)[j] ]似乎注定要失败.在强制之后,该参数的结果将是 0 或 1(因此应该出现有关替换长度为零的错误)。也许您应该解释一下您实际尝试的是什么。 -
其实它比其他函数(例如 grep)效果更好。我只是想计算在数据帧 (pidf[i,]) 的每一行中找到字符串 (row.names(pddbnh)[j]) 的次数。
-
发布一个小例子(... dropbox 不再是共享数据的友好方式)。也许这个例子会说明为什么一个逻辑索引如果返回 FALSE 就不会产生错误。
标签: r loops for-loop match vectorization