У меня есть вектор объектов (object
) вместе с соответствующим вектором временных рамок (tframe
), в котором были обнаружены объекты. Для каждой уникальной пары объектов я хочу рассчитать количество временных рамок, в которых наблюдались оба объекта..Ускорение подсчета числа уникальных наблюдений
Я могу написать код, используя петли for()
, но для увеличения количества уникальных объектов требуется много времени. Как я могу изменить код, чтобы ускорить время выполнения?
Ниже приведен пример с 4 уникальными объектами (в действительности у меня около 300). Например, объекты a
и c
наблюдались во временных рамках 1
и 2
, поэтому они получают количество 2
. Объекты b
и d
не наблюдались в тот же период времени, поэтому они получают счет 0
.
object <- c("a", "a", "a", "b", "b", "c", "c", "c", "c", "d")
tframe <- c(1, 1, 2, 2, 3, 1, 2, 2, 3, 1)
uo <- unique(object)
n <- length(uo)
mpairs <- matrix(NA, nrow=n*(n-1)/2, ncol=3, dimnames=list(NULL,
c("obj1", "obj2", "sametf")))
row <- 0
for(i in 1:(n-1)) {
for(j in (i+1):n) {
row <- row+1
mpairs[row, "obj1"] <- uo[i]
mpairs[row, "obj2"] <- uo[j]
# no. of time frames in which both objects in a pair were observed
intwin <- intersect(tframe[object==uo[i]], tframe[object==uo[j]])
mpairs[row, "sametf"] <- length(intwin)
}}
data.frame(object, tframe)
object tframe
1 a 1
2 a 1
3 a 2
4 b 2
5 b 3
6 c 1
7 c 2
8 c 2
9 c 3
10 d 1
mpairs
obj1 obj2 sametf
[1,] "a" "b" "1"
[2,] "a" "c" "2"
[3,] "a" "d" "1"
[4,] "b" "c" "2"
[5,] "b" "d" "0"
[6,] "c" "d" "1"
не знаю, если это будет быстрее, но, возможно, понятнее ... 'вкладка <- tcrossprod (таблица (уникальный (d)))' получает вас отсчеты вы хотите, так что затем переставить (если необходимо) 'tab [lower.tri (tab, TRUE)] <- NA; reshape2 :: melt (tab, na.rm = TRUE) ' – user20650
[Найти все последовательности с одинаковым значением столбца] (http://stackoverflow.com/questions/36827378/find-all-sequences-with-the-same -column-value) – rawr
@ user20650 Что такое 'd' в вашем примере? –