Ускорить попарный подсчет уникальных наблюдений

У меня есть вектор объектов (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"   
7 голосов | спросил Jean V. Adams 8 J0000006Europe/Moscow 2016, 00:01:15

1 ответ


0

Вы можете использовать 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)
ответил user20650 8 J0000006Europe/Moscow 2016, 01:15:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132