Вычисление разницы между точками в векторе

Я пытаюсь вычислить разницу между всеми точками в векторе длиной 10605 в R. Например, я пытаюсь сделать это:

for (i in 1:10605){
   for (j in 1:10605){
     differences[i] = housedata$Mean_household_income[i] - housedata$Mean_household_income[j]
  }
}

Вычисление занимает так много времени, и я думаю, что есть более своевременный способ вычислить разницу между всеми точками друг с другом в этом векторе. У кого-нибудь есть предложения?

Спасибо!


person intern14    schedule 22.03.2018    source источник


Ответы (3)


Похоже, это должна делать функция dist. Матрицы расстояний имеют форму нижнего треугольника только потому, что distance(x,y) == distance(y,x):

 my.distances <- dist(housedata$Mean_household_income,
                      housedata$Mean_household_income)

Это будет быстрее, так как это делается в коде C. Просто введите:

dist
person IRTFM    schedule 22.03.2018
comment
Упс, хотел прокомментировать. Вместо этого отредактировал. Извини!. dist принимает только один ввод. Так что я думаю, что это должно быть dist(as.matrix(houssedata$Mean_household_income,ncol=1) - person bala83; 23.03.2018

Вы можете прокрутить постепенно сдвинутую/обернутую копию вектора и вычесть два вектора. Вам все равно придется один раз перебирать длину данных и каждый раз сдвигать и вычитать вектор, но это, вероятно, сэкономит некоторое время.

Вот пример:

# make a shift/wrap function
shift <- function(df,offset){
  df[((1:length(df))-1-offset)%%length(df)+1]
}

# make some data
data <- seq(1,4)

# make an empty vector to hold the data
difs = vector()

# loop through the data
for(i in 1:length(data)){
  shifted <- shift(data,i)
  result <- data - shifted
  difs <- c(difs, result)
}

print(difs) 
person Justin Braaten    schedule 22.03.2018

Как насчет использования outer? Он использует векторизованную функцию (здесь -) для всех комбинаций двух векторов и сохраняет результаты в матрице.

Например,

x <- runif(10605)

system.time(
  differences <- outer(x, x, '-')
)

занимает одну секунду на моем компьютере.

person F. Privé    schedule 23.03.2018