9
votes

Créer une série alternative en r

J'ai une liste de -0.5 , -0.6 , 0.7 , 1 , 1.5 , 3 , -5 et je voudrais le trier comme 3 , -5 , 1.5 , -0.6 , 1 , -0.5 , 0.7 . En d'autres termes, je voudrais éparpiller la liste en listes positives et négatives, puis les trier du plus grand au plus petit , mais en alternance.

Comment puis-je faire cela?


3 commentaires

Est-ce une liste ou un vecteur?


Savez-vous savez que le nombre de nombres positifs et négatifs est égal?


@Henry ils ne le sont pas vraiment! Mais je ne peux pas vraiment les changer, alors je vais simplement les laisser tels qu'ils sont.


4 Réponses :


2
votes

Une option consiste à diviser le vecteur par le signe du vecteur dans une liste des vecteurs s, parcourez le vecteur , commandez la valeur olute abs des éléments dans ordre décroissant , récupérez les longueurs des éléments list de la même manière avec le remplissage NA à la fin, rbind ensemble sous forme de matrice , convertissez-le en vecteur avec c et supprimez les éléments NA avec na.omit

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

données

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


0 commentaires

5
votes

Nous pouvons diviser la liste en les signe et les trier . Nous créons ensuite une nouvelle liste en prenant des éléments alternés de listes positives et négatives en veillant à rev erse la partie positive de la liste.

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

data

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


0 commentaires

8
votes

Data

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

Utilisez rbind () pour créer un autre vecteur d'index.

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


0 commentaires

2
votes

Que diriez-vous de

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 commentaires