1
votes

Appliquer la même fonction à plusieurs objets dans R (boucle for?)

J'ai une liste d'objets contenant différents nombres de données, sur lesquels je souhaite exécuter globalement la même fonction round . Y a-t-il un moyen de le faire en une fois tout en gardant les objets séparés (pour que chaque objet corresponde aux données qu'il devrait contenir), sans avoir à aller le faire manuellement comme suit?

mon code en essayant d'itérer manuellement la même fonction pour chaque objet

Merci, Katie

Edit1:

> D41
[1] 1.366 1.223 1.223 2.703 1.205 2.053
> d44
[1] 8.929 13.793
> D41r <- round(D41,2)
> d44r <- round(d44,2)
> D41r
[1] 1.37 1.22 1.22 2.70 1.21 2.05
> d44r
[1] 8.93 13.79

Ici, je viens de montrer deux objets parmi les nombreux autres objets, chacun avec un nombre différent de données.

Y a-t-il un moyen de créer un bloc de données qui a "un nombre différent de lignes", ou d'exécuter une fonction pour chaque objet en se remplaçant en conséquence? p >


5 commentaires

Bienvenue à SO! Veuillez fournir un exemple minimal reproductible . En particulier, fournissez des exemples de données, par exemple avec dput () et votre code dans votre question. Par cela, les chances sont beaucoup plus élevées pour obtenir de l'aide.


Désolé pour cela @all qui a répondu, je suis assez nouveau à la fois en R et en stack overflow! Un exemple serait donc le suivant:> D41 [1] 1.366 1.223 1.223 2.703 1.205 2.053> d44 [1] 8.929 13.793> D41r <- round (D41,2)> d44r <- round (d44,2)> D41r [1 ] 1.37 1.22 1.22 2.70 1.21 2.05> d44r [1] 8.93 13.79 Ici, je viens de montrer deux objets. Mais j'ai plus d'objets avec un nombre variable de données. Existe-t-il un moyen de créer un bloc de données qui a "un nombre différent de lignes", ou d'exécuter une fonction pour chaque objet en se remplaçant en conséquence?


veuillez plutôt modifier votre question et prendre soin de la mise en forme du code


encore une fois. Veuillez modifier votre question plutôt que de publier des commentaires.


@mnist oui désolé, j'ai réalisé que je ne pouvais pas ajouter de code avec des sauts de ligne dans les commentaires. Je ne savais pas que je pouvais modifier ma question - merci.


3 Réponses :


0
votes

Solution de base R:

lapply(obj_list, function(x){if(length(grep("D\\d+", names(x))) > 0){round(x, 3)}else{x}})


0 commentaires

0
votes

D'après votre capture d'écran, il semble que le problème est que vos objets ne sont pas dans une liste avec laquelle vous pouvez facilement travailler, mais simplement stockés sous forme de valeurs dans votre environnement global (ou .GlobalEnv ). Voici une solution de contournement en utilisant ls () et getElement :

lapply(ls(), function(x) {
  new_value <- round(getElement(.GlobalEnv, x))
  assign(x, new_value, pos = .GlobalEnv) # re-assign its value to the rounded value
})

ls () listera les noms des valeurs et des objets (tout) dans .GlobalEnv (votre environnement global). Vous devrez peut-être utiliser grep pour sélectionner uniquement ceux que vous voulez, cela dépend de ce qu'il y a d'autre.

Avec getElement vous pouvez alors fournir les noms des objets sous forme de chaînes de caractères (c'est ainsi que ls () les retournera, et extraira leurs valeurs d'où ils existent. Ainsi, votre premier argument de getElement est .GlobalEnv , l'emplacement où vivent les objets. Et le deuxième argument est le nom de l'objet. Si vous souhaitez modifier sa valeur dans l'environnement global, vous pouvez alors utiliser la fonction assign pour l'écraser essentiellement, ce qui vous permet de la même manière de spécifier le nom de la valeur, sous forme de chaîne de caractères, puis .GlobalEnv comme argument position si l'objet vit simplement dans votre environnement global.


0 commentaires

0
votes

Comme je n'ai pas pu saisir votre structure de données, j'ai construit une structure similaire:

library(tidyverse)
dfd3 <-  dfD %>% 
 mutate(L3 = round(Dval, digits = 3))

dfd3
R> dfD
     D     Dval     L3
1  D25 20.90942 20.909
2  D53 21.51484 21.515
3  D59 18.11695 18.117
4  D44 20.29304 20.293
5  D57 19.51578 19.516
6  D22 21.72018 21.720
7  D16 20.62322 20.623
8  D31 21.97484 21.975
9  D18 19.26036 19.260
10 D61 22.08744 22.087
11 D37 19.36332 19.363
12 D55 20.67799 20.678

Ensuite, j'ai arrondi tous les Dval à trois chiffres: p >

dfD <- data.frame(D = paste0("D", sample(14:64, 12)),
              Dval = rnorm(12, mean = 20))

R > dfD
     D     Dval
1  D25 20.90942
2  D53 21.51484
3  D59 18.11695
4  D44 20.29304
5  D57 19.51578
6  D22 21.72018
7  D16 20.62322
8  D31 21.97484
9  D18 19.26036
10 D61 22.08744
11 D37 19.36332
12 D55 20.67799

Je pense que c'est ce que vous recherchez.


0 commentaires