2016-06-07 3 views
7

У меня есть вектор объектов (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" 
+1

не знаю, если это будет быстрее, но, возможно, понятнее ... 'вкладка <- tcrossprod (таблица (уникальный (d)))' получает вас отсчеты вы хотите, так что затем переставить (если необходимо) 'tab [lower.tri (tab, TRUE)] <- NA; reshape2 :: melt (tab, na.rm = TRUE) ' – user20650

+1

[Найти все последовательности с одинаковым значением столбца] (http://stackoverflow.com/questions/36827378/find-all-sequences-with-the-same -column-value) – rawr

+0

@ user20650 Что такое 'd' в вашем примере? –

ответ

4

Вы можете использовать crossproduct, чтобы получить счет согласен. Затем вы можете изменить данные , если это необходимо.

Пример

object <- c("a", "a", "a", "b", "b", "c", "c", "c", "c", "d") 
tframe <- c(1, 1, 2, 2, 3, 1, 2, 2, 3, 1) 

# This will give you the counts 
# Use code from Jean's comment 
tab <- tcrossprod(table(object, tframe)>0) 

# Reshape the data 
tab[lower.tri(tab, TRUE)] <- NA 
reshape2::melt(tab, na.rm=TRUE) 
Смежные вопросы