Преобразуйте этот цикл for в функцию применения R

У меня есть вектор данных, например:

data <- c(1, 3, 4, 7)

И я хотел бы применить функцию к каждой паре элементов в векторе, чтобы она возвращала матрицу верхнего треугольника, как показано ниже:

mat <- matrix(data = NA, nrow = length(data), ncol = length(data))
for (i in 1:(length(data) - 1)) {
  for (j in (i+1):length(data)) {
    mat[i, j] <- "-"(data[j], data[i])
  }
}

Но я хотел бы сделать это с помощью функции типа применения вместо цикла for.

Я не знаю, как это сделать. Какие-либо предложения?

Спасибо!


person efbbrown    schedule 21.01.2016    source источник


Ответы (2)


Мы можем использовать combn

mat[lower.tri(mat, diag=FALSE)] <- combn(data, 2,
                            FUN= function(x) x[2]-x[1])
t(mat)
#      [,1] [,2] [,3] [,4]
#[1,]   NA    2    3    6
#[2,]   NA   NA    1    4
#[3,]   NA   NA   NA    3
#[4,]   NA   NA   NA   NA

данные

mat <- matrix(data = NA, nrow = length(data), ncol = length(data))
person akrun    schedule 21.01.2016
comment
@nicola Спасибо за комментарии. Похоже, теперь это исправлено. - person akrun; 21.01.2016

Использование outer:

t(outer(data,data,"-"))*
    NA^lower.tri(matrix(0,length(data),length(data)),diag=TRUE)
#     [,1] [,2] [,3] [,4]
#[1,]   NA    2    3    6
#[2,]   NA   NA    1    4
#[3,]   NA   NA   NA    3
#[4,]   NA   NA   NA   NA
person nicola    schedule 21.01.2016