【问题标题】:R merged loop performanceR合并循环性能
【发布时间】:2016-11-22 09:58:19
【问题描述】:

我有 4000 列的 2000 行数据。我要做的是将每一行与其余行进行比较,看看它们在不同列/总列方面有多相似。

到目前为止我所做的如下:

for (i in 1:nrow(data))
{
    for (j in (i+1):nrow(data))
    { 
        mycount[[i,j]] = length(which(data[i,] != data[j,]))
    }
}

它有2个问题,j不是从i+1开始的(这可能是一个基本错误) 然而,主要问题是它消耗的时间,它需要很长时间......

有人可以建议一种更合适的方法来获得相同的结果,结果是每行与其他行的相似度百分比吗?

这是一个数据示例以及我想要实现的目标:

输出应该是这样的:

mycount[1,2] = 2 (S# and var3 columns are different)
mycount[1,3] = 2 (S# and var1 columns are different)
mycount[1,4] = 2 (S# and var4 columns are different)
mycount[2,3] = ...
mycount[2,4] = ...
mycount[3,4] =  3 (S#, var1 and var 4 are different)

【问题讨论】:

  • 所以你想将每一行与它正下方的行进行比较,看看它是否相同?
  • 不是从i+1开始是因为i+1:nrow(data),读作i + 1:nrow(data)需要加括号:(i+1):nrow(data)
  • 你能加一个reproducible example吗?
  • @sebastian-c;不只是下面的那一行,而是剩下的所有行
  • @MarijnStevering 谢谢,更正了那个

标签: r performance compare similarity


【解决方案1】:

代码中的一个问题是mycount[[i]] 的值在j 循环的每次迭代中都会更新(之前的值被覆盖)所以你最终得到的是mycount[[i]] 等于length(which(data[i,] != data[nrow(data),])) .另一个问题是i+1:nrow(data) 不会产生数字i+1, i+2, ... nrow(data) 而是i + (1:nrow(data))。所以你想要的是(i + 1):nrow(data)seq(i + 1, nrow(data))

你可以试试下面的代码,会比双循环快(不过可能还是太慢了)

rows <- lapply(seq(nrow(data)), function(i) data[i, ])
outer(X = rows, Y = rows, FUN = Vectorize(function(x, y) sum(x == y)))

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 2016-06-18
    • 2017-07-12
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2018-12-20
    相关资源
    最近更新 更多