Организация списка векторов в соответствии с суммой квадрата каждого элемента - PullRequest
0 голосов
/ 07 мая 2018
x <- list(c(1,2), c(1,4), c(1,1))

Я хочу расположить векторы списка в соответствии с их суммой квадратов элементов каждого вектора.

Сумма квадратов трех векторов:

1^2 + 2^2 = 5,

1^2 + 4^2 = 17,

1^2 + 1^2 = 2.

Поскольку, 2 < 5 < 17, желаемый результат будет:

   vectors   squaresum
    c(1,1)    2

    c(1,2)    5

    c(1,4)    17

Я думал построить функцию за квадратную сумму. Затем с помощью этой функции отсортировать векторы. Но не смог сделать правильно. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Вот еще один подход, который можно использовать, если все векторы списка имеют одинаковую длину:

x[order(rowSums(do.call(rbind, x)^2))]

[[1]]
[1] 1 1

[[2]]
[1] 1 2

[[3]]
[1] 1 4

однако, похоже, он не дает никаких преимуществ по скорости в больших списках по сравнению с @clemens (я действительно думал, что это будет):

x <- replicate(10000, sample(1:1000, 100, replace = TRUE), simplify = FALSE)

library(microbenchmark)

microbenchmark(clemens = x[order(sapply(x, function(v) sum(v ** 2)))],
               missuse = x[order(rowSums(do.call(rbind, x) ^ 2))])
#output
Unit: milliseconds
    expr      min       lq     mean   median       uq      max neval cld
 clemens 32.03712 34.65821 59.16911 43.51531 57.19269 822.7295   100   a
 missuse 32.84621 35.33422 47.53151 42.69733 56.09183 107.2334   100   a
0 голосов
/ 07 мая 2018

Вы можете пройтись по списку, чтобы вычислить сумму квадратов каждого вектора, и использовать order(), чтобы получить индексы значений в порядке возрастания. Затем вы можете использовать их для сортировки вашего начального списка x:

x[order(sapply(x, function(v) sum(v ** 2)))]

результат:

[[1]]
[1] 1 1

[[2]]
[1] 1 2

[[3]]
[1] 1 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...