2 votes

À partir d'un vecteur d'entiers, construire un vecteur plus long comprenant tous les entiers dont la distance par rapport aux entiers d'origine est d'au plus 10 %.

J'ai ce vecteur entier :

m <- 10
n <- 1000
index <- sample(seq_len(n), m)

Je veux étendre index en incluant tous les entiers dont la distance par rapport à l'une des valeurs dans index n'est pas supérieure à 10, et éliminer les doublons. Les doublons ne sont pas très probables, avec les valeurs actuelles de n y m mais mieux vaut prévenir que guérir, et de toute façon, la solution doit fonctionner avec des valeurs génériques de n y m avec m<n .

Actuellement, je fais ce qui suit :

library(purrr)
index <- unique(sort(unlist(map(index, function(x) seq(x - 10, x + 10)))))

Cela fonctionne, mais ce n'est pas très lisible. Vous avez une meilleure idée ?

4voto

akrun Points 148302

Nous pouvons l'acheminer pour le rendre plus lisible

library(tidyverse)
out <- map(index, ~ seq(.x - 10, .x + 10) ) %>% # get the sequence 
         unlist %>%    # unlist the list to a vector
         unique %>%    # get the unique values
         sort          # sort

Au lieu de faire une boucle, nous pouvons aussi vectoriser ceci en rep En calculant l'indice et en ajoutant la séquence de chiffres de -10 à 10, on obtient le résultat suivant unique éléments et sort

out2 <- sort(unique(rep(index, each = 21) + (-10:10)))
identical(out, out2)
#[1] TRUE

3voto

Gregor Points 6270

Personnellement, j'utiliserais outer plutôt que map pour ça :

sort(unique(outer(index, -10:10, "+")))

Et, comme le montre akrun, vous pouvez utiliser la tuyauterie si vous préférez ne pas emboîter les choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X