1
votes

comment sélectionner des éléments voisins dans un vecteur et les mettre dans une liste ou une matrice dans R

J'ai un problème sur la façon de sélectionner des éléments voisins dans un vecteur et de les mettre dans une liste ou une matrice dans R. Par exemple:

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

Je veux obtenir les résultats comme ceci:

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

Les résultats peuvent être dans une liste ou une matrice p >

Je sais que nous pouvons utiliser une boucle pour obtenir des résultats. Comme ceci:

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

Mais j'ai un gros volume de données. L'utilisation de la boucle est relativement lente. Existe-t-il une fonction pour obtenir des résultats directement? Merci beaucoup!

r

0 commentaires

3 Réponses :


0
votes

Vous pouvez faire:

sapply(c(pmin, pmax), do.call, data.frame(vl[-length(vl)], vl[-1]))

Si vous souhaitez trier deux colonnes par ligne, vous pouvez utiliser pmin () et pmax () code> qui sera plus rapide que d'utiliser apply (x, 1, sort) avec un grand nombre de lignes.

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

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


4 commentaires

Même méthode, mais un peu plus directe: cbind (vl [-length (vl)], vl [-1])


Merci beaucoup pour la réponse! "cbind" est une très bonne méthode. Cependant, j'ai oublié de dire que dans chaque ligne, les éléments doivent être triés. Je suis désolé, l'exemple n'est pas très clair. Un autre exemple est: vl <- c (2,5,3,1,6,4). Le résultat devrait être comme: 2,5 3,5 1,3 1,6 4,6. Merci beaucoup!


@Freeego tri post-hoc.


Désolé pour la réponse tardive! Merci beaucoup! Les méthodes sont très bonnes!



1
votes

Nous pouvons utiliser head et tail pour ignorer respectivement le dernier et le premier élément.

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

EDIT

Si les données doivent être triées, nous pouvons utiliser apply ligne par ligne pour le trier.

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

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


2 commentaires

Merci beaucoup pour la réponse! Cependant, j'ai oublié de dire que dans chaque ligne, les éléments doivent être triés. Je suis désolé, l'exemple n'est pas très clair. Un autre exemple est: vl <- c (2,5,3,1,6,4). Le résultat devrait être comme: 2,5 3,5 1,3 1,6 4,6.


@Freeego Nous pouvons le trier par ligne en utilisant apply . Mise à jour de la réponse.



0
votes

Le problème peut également être résolu en appliquant la fonction sort () sur une fenêtre déroulante de longueur 2:

t(rowr::rollApply(vl, sort, 2L, 2L))

qui renvoie une matrice comme demandé:

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

Notez que le vecteur d'entrée modifié vl est utilisé qui a été posté par l'OP dans les commentaires ici et ici .

Outre zoo , il existe également d'autres packages qui offrent des fonctions rollapply , par exemple,

XXX


0 commentaires