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.