Si j'ai des vecteurs m1, m2, ... m "n" et que je veux créer un vecteur qui inclut toutes les valeurs, comment procéderais-je?

Par exemple:

m1 = c(0, 2, 4) 
m2 = c(1, 4)
m3 = (3)

Je veux un vecteur "totalmods" qui renvoie {0, 2, 4, 1, 4, 3}

Ma tentative où nummod est "n", le vecteur avec le plus grand nombre était:

for(i in 1:nummod){
  totalmods <- c(paste("m",i, sep = ""))
}

Merci de votre aide!

3
ReidD 2 juin 2020 à 20:48

3 réponses

Meilleure réponse

Vous pouvez utiliser mget et unlist

unlist(mget(ls(pattern = "^m\\d+$")), use.names = FALSE)
# [1] 0 2 4 1 4 3

Nous créons une liste avec tous les objets dont les noms commencent par "m" (^m) et se terminent par un ou plusieurs chiffres (\\d+$). Nous utilisons unlist pour créer un vecteur.


Un utilisateur a demandé un benchmark dans les commentaires (et je suis devenu curieux)

x <- 2:2000
y <- setNames(lapply(x, seq_len),  paste0("m", x))

library(microbenchmark)
microbenchmark(markus = unlist(y, use.names = FALSE),
               tmfmnk = Reduce(c, y),
               akrun = purrr::flatten_dbl(y)
               times = 10L)
#Unit: milliseconds
#   expr       min        lq       mean    median        uq       max neval
# markus   13.7329   13.8566   22.09223   13.9139   14.1638   75.9402    10
# tmfmnk 3427.3571 3614.2938 3761.36990 3806.0890 3928.1482 4004.7853    10
# akrun    42.7355   64.4865   153.8598  148.5418  240.0674  286.8956    10
1
markus 2 juin 2020 à 20:24

Une option pourrait être:

Reduce(c, mget(ls(pattern = "^m\\d+")))

[1] 0 2 4 1 4 3
0
tmfmnk 2 juin 2020 à 18:05

Une option avec flatten

library(purrr)
mget(ls(pattern = "^m\\d+")) %>%
    flatten_dbl
#[1] 0 2 4 1 4 3
0
akrun 2 juin 2020 à 19:08