Создание альтернативных серий в r - PullRequest
0 голосов
/ 30 января 2019

У меня есть список -0.5, -0.6, 0.7, 1, 1.5, 3, -5, и я хотел бы отсортировать его как 3, -5, 1.5, -0.6, 1, -0.5, 0.7.Другими словами, я хотел бы разбить список на положительные и отрицательные списки, а затем отсортировать их от наибольшего к наименьшему , но чередуя.

Как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 30 января 2019

Как насчет

pos <- sort(x[x>0], decreasing = T)
neg <- sort(x[x<0], decreasing = T)

c(rbind(pos,neg))[1:length(x)]

#[1]  3.0 -0.5  1.5 -0.6  1.0 -5.0  0.7
0 голосов
/ 30 января 2019

Мы можем split список на основе sign и sort их.Затем мы создаем новый список, беря чередующиеся элементы из положительных и отрицательных списков, убедившись, что rev равен положительной части списка.

new_list <- sapply(split(x, sign(x)), sort)
c(rbind(rev(new_list[['1']]), new_list[['-1']]))[1:length(x)]
#[1]  3.0 -5.0  1.5 -0.6  1.0 -0.5  0.7

data

x <- c(-0.5, -.6, 0.7, 1, 1.5, 3, -5 )
0 голосов
/ 30 января 2019

Данные

x <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)

Используйте rbind() для создания альтернативного вектора индексов.

ind <- seq_along(x)
sort(x, decreasing = T)[c(rbind(ind, rev(ind)))][ind]
# [1]  3.0 -5.0  1.5 -0.6  1.0 -0.5  0.7

Этот метод выше должен занимать много памяти, так какэто создаст вдвое более длинный вектор.Чтобы победить его, вы можете установить midpoint в качестве конечного индекса.В этом случае это будет ceiling(7 / 2) = 4.

n <- length(x)
ind <- 1:ceiling(n / 2) # [1] 1 2 3 4
sort(x, decreasing = T)[c(rbind(ind, (n:1)[ind]))][1:n]
# [1]  3.0 -5.0  1.5 -0.6  1.0 -0.5  0.7
0 голосов
/ 30 января 2019

Один из вариантов - split vector с помощью sign из vector в list из vector с, цикл через vector, order abs раствор.значение элементов в порядке decreasing, получить lengths элементов list, одинаковые с заполнением NA в конце, rbind их вместе как matrix, преобразовать его в vector с помощью c и удалите элементы NA с na.omit

lst1 <- sapply(split(v1, sign(v1)), function(x)  
    x[order(abs(x), decreasing = TRUE)])[2:1]
c(na.omit(c(do.call(rbind, lapply(lst1, `length<-`, max(lengths(lst1)))))))
#[1]  3.0 -5.0  1.5 -0.6  1.0 -0.5  0.7

data

v1 <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...