как выбрать соседние элементы в векторе и поместить их в список или матрицу в R - PullRequest
1 голос
/ 24 марта 2020

У меня проблема с тем, как выбрать соседние элементы в векторе и поместить их в список или матрицу в R. Например:

vl <- c(1,2,3,4,5)

Я хочу получить такие результаты:

1,2
2,3
3,4
4,5

Результаты могут быть в виде списка или матрицы

Я знаю, что мы можем использовать al oop для получения результатов. Как это:

pl <- list()
k=0
for (p in 1: length(vl)) {
          k=k+1
          pl[[k]] <- sort(c(vl[p],vl[p+1]))}

Но у меня есть большие данные. Использование l oop относительно медленно. Есть ли какая-либо функция для получения результатов напрямую? Большое спасибо!

Ответы [ 3 ]

1 голос
/ 24 марта 2020

Мы можем использовать head и tail, чтобы игнорировать последний и первый элемент соответственно.

data.frame(a = head(vl, -1), b = tail(vl, -1))

#  a b
#1 1 2
#2 2 3
#3 3 4
#4 4 5

РЕДАКТИРОВАТЬ

Если данные должны быть отсортированы, мы можем использовать apply по строкам для их сортировки.

vl <- c(2,5,3,1,6,4)
t(apply(data.frame(a = head(vl, -1), b = tail(vl, -1)), 1, sort))


#     [,1] [,2]
#[1,]    2    5
#[2,]    3    5
#[3,]    1    3
#[4,]    1    6
#[5,]    4    6
0 голосов
/ 24 марта 2020

Эту проблему также можно решить, применив функцию sort() к скользящему окну длины 2:

vl <- c(2,5,3,1,6,4)
zoo::rollapply(vl, 2L, sort)

, которая возвращает матрицу в соответствии с запросом:

     [,1] [,2]
[1,]    2    5
[2,]    3    5
[3,]    1    3
[4,]    1    6
[5,]    4    6

Обратите внимание, что используется модифицированный вектор ввода vl, который ОП опубликовал в комментариях здесь и здесь .

Помимо zoo, есть и другие пакеты, которые предлагают функции rollapply , например,

t(rowr::rollApply(vl, sort, 2L, 2L))
0 голосов
/ 24 марта 2020

Вы можете сделать:

matrix(c(vl[-length(vl)], vl[-1]), ncol = 2)

     [,1] [,2]
[1,]    1    2
[2,]    2    3
[3,]    3    4
[4,]    4    5

Если вы хотите отсортировать два столбца по строкам, тогда вы можете использовать pmin() и pmax(), что будет быстрее, чем apply(x, 1, sort) с большим количеством строки.

sapply(c(pmin, pmax), do.call, data.frame(vl[-length(vl)], vl[-1]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...