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(这可能是一个基本的错误) 的主要问题然而这是它消耗的时间,它需要的时间...
有人可以请建议一个更正确的方式来实现相同的结果,结果是每行的相似度与其他行的百分比?
这是我想达到的目标数据的例子和:
输出应该是这样的:
在你的代码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)
答
的一个问题是,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)))
所以,你要比较每列的行正下方它,看它是否是相同的? –
不是从i + 1开始是因为'i + 1:nrow(data)',它读作'i + 1:nrow(data)',你需要添加一些偏见:'(i + 1):nrow (数据)'。 –
请问您可以添加一个[可重现的例子](http://*.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? – fridaymeetssunday