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?
4 Réponses :
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)
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
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
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
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
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.