2016-11-22 3 views
0

У меня есть 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 не начинается с + 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://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? – fridaymeetssunday

ответ

0

Одна из проблем в коде является то, что значение 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))) 
Смежные вопросы