R合并循环性能

问题描述:

我有2000行4000列的数据。我想要做的是将每行与其余行进行比较,并查看它们在不同列/总列中的相似程度。R合并循环性能

我所做的一切至今如下:

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(这可能是一个基本的错误) 的主要问题然而这是它消耗的时间,它需要的时间...

有人可以请建议一个更正确的方式来实现相同的结果,结果是每行的相似度与其他行的百分比?

这是我想达到的目标数据的例子和: screenshot of the image

输出应该是这样的:

在你的代码
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) 
+0

所以,你要比较每列的行正下方它,看它是否是相同的? –

+2

不是从i + 1开始是因为'i + 1:nrow(data)',它读作'i + 1:nrow(data)',你需要添加一些偏见:'(i + 1):nrow (数据)'。 –

+1

请问您可以添加一个[可重现的例子](http://*.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? – fridaymeetssunday

的一个问题是,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)))